Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
1

Нужно вставить в программу правильную формулу

27.06.2009, 23:55. Просмотров 2402. Ответов 23
Метки нет (Все метки)

Привет всем)) Помогите пожалуйста вставить в прогу правильную формулу.
Вот сама задача:
Должны быть реализованные подпрограммы рисования дуги круга заданной:
координатами центра, координатами стартовой точки и величиной угла

вот сам код проги:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <graphics.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
double rad(double f)
{
  return 180*f/3.14159265358979;
}
 
void Build(int x,int y,int x1,int y1,int f)
{
  double r=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
  int gd=DETECT,gm=0;
  initgraph(&gd,&gm,"D:\\TC\\BGI");
  double y2=y1-y;
  double fi=(y2/r);
  double fs=rad(sinh(fi)); //препод сказал вот здесь у меня ошибка(а именно не та формула)
  if (x<=x1 && y<=y1) fs=fs; else
  if (x<x1 && y>y1) fs=270+fs; else
  if (x>x1 && y<y1) fs=90+fs;     else
  fs=180+fs;
  arc(x,y,fs,f+fs,r);
}
 
int main()
{
printf("Write center coord "); int x,y; scanf("%d %d",&x,&y);
printf("Write start coord "); int x1,y1; scanf("%d %d",&x1,&y1);
printf("Write angle "); int f; scanf("%d",&f);
clrscr();
Build(x,y,x1,y1,f);
getch();
return 0;
}
Он обьяснил что нужно делать так:
Стартовый угл: atan 2 (y-y1,x-x1)
Конечный угл: стартовый + угл поворота

Как это сделать??Заранее спасибо!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2009, 23:55
Ответы с готовыми решениями:

Нужно вставить формулу в программу
y= \begin{cases} ln\left(-x \right) &amp; \text{ , } x \lt 1 \\ -\sqrt{1-x^2} &amp; \text{ , } -1 \le x...

Количество способов вставить скобки в правильную скобочную последовательность
Здравствуйте! Задача: Вводится строка из символов &quot;(&quot; и &quot;)&quot; .Строка всегда будет правильной...

Нужно вставить счетчик операций в программу
Здравствуйте товарищи программеры тут такая ситуация Есть уже написанная прога Единственно в...

Сколько нужно убрать из данной последовательности скобок, чтобы получить правильную последовательность?
Сколько надо убрать скобок из данной последовательности скобок что бы получить правильную...

23
4845 / 3266 / 465
Регистрация: 10.12.2008
Сообщений: 10,569
28.06.2009, 06:14 2
о, и тут пропало, где рекомендовали заменить sinh на sin
0
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
28.06.2009, 17:39  [ТС] 3
Цитата Сообщение от accept Посмотреть сообщение
о, и тут пропало, где рекомендовали заменить sinh на sin
Та знаю что рекомендовали но это было неправильно
0
4845 / 3266 / 465
Регистрация: 10.12.2008
Сообщений: 10,569
29.06.2009, 09:23 4
тут формула тангенса на графике, арктангенс вычисляет угол, из которого выведен тангенс
0
Миниатюры
Нужно вставить в программу правильную формулу  
4 / 4 / 0
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 10:46 5
Замени гиперболический синус на обычный
0
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
29.06.2009, 15:00  [ТС] 6
Цитата Сообщение от Невик Посмотреть сообщение
Замени гиперболический синус на обычный
А ты не мог бы кодом показать
0
4 / 4 / 0
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 15:04 7
double fs=rad(sin(fi)); вместо double fs=rad(sinh(fi));
0
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
29.06.2009, 21:41  [ТС] 8
Цитата Сообщение от Невик Посмотреть сообщение
double fs=rad(sin(fi)); вместо double fs=rad(sinh(fi));
Спасибо но это мне уже предлагали, это не правильный ответ
0
4 / 4 / 0
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 22:21 9
Цитата Сообщение от Alex1991 Посмотреть сообщение
Спасибо но это мне уже предлагали, это не правильный ответ
Вообще убери синус. В rad() подставляется угол, а не его синус.
0
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
29.06.2009, 22:40  [ТС] 10
походу нужно так збацать
C++
1
2
3
4
5
6
7
8
void Build(int x,int y,int x1,int y1,int f)
{
  double r=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
  int gd=DETECT,gm=0;
  initgraph(&gd,&gm,"D:\\TC\\BGI");
  double fs=rad(atan2(y-y1,x1-x));
  arc(x,y,fs,f+fs,r);
}
и я неправ ??
0
4 / 4 / 0
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 22:49 11
Правильно double fs=rad(abs(atan(y/x)-atan(y1/x1)));
0
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
29.06.2009, 23:35  [ТС] 12
Всмысле так ??
C++
1
2
3
4
5
6
7
8
void Build(int x,int y,int x1,int y1,int f)
{
  double r=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
  int gd=DETECT,gm=0;
  initgraph(&gd,&gm,"D:\\TC\\BGI");
  double fs=rad(abs(atan(y/x)-atan(y1/x1)));
  arc(x,y,fs,f+fs,r);
}
0
4 / 4 / 0
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 23:52 13
Проверь по результату. Должно быть так.
0
4845 / 3266 / 465
Регистрация: 10.12.2008
Сообщений: 10,569
30.06.2009, 03:44 14
Код
    double fi=(y2/r);
это вообще косинус начального угла и препод тебе правильно сказал, что надо вычислить арктангенс для того, чтобы найти начальный угол
или же тогда арккосинус вот этого значения
ты находишь альфа, а потом к альфе прибавляешь угол, который у тебя дан
и смысл этого в том, чтобы сделать
C
1
void far _Cdecl arc(int __x, int __y, int __stangle, int __endangle, int __radius);
то есть
C
1
    arc(Ox, Oy, альфа, альфа+который_дан, r);
откуда у тебя там радианы ?

если у тебя угол дан в радианах, то формула градусы = угол/PI*180
формулу проверил - у тебя правильная
C
1
2
3
4
double radtograd(double frad)
{
    return 180*frad/M_PI;
}
и чего ты тут вот намудрил
Код
    double fs = rad(atan2(y-y1, x1-x));
    arc(x, y, fs, f+fs, r);
угол посчитал правильно а подставил его вообще глючно, какое f ?

надо вот так
C
1
    arc(x, y, fs, fs+f, r);
так оно не просто красивее, оно понятнее
0
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
30.06.2009, 04:14  [ТС] 15
Цитата Сообщение от accept Посмотреть сообщение
Код
    double fi=(y2/r);
это вообще косинус начального угла и препод тебе правильно сказал, что надо вычислить арктангенс для того, чтобы найти начальный угол
или же тогда арккосинус вот этого значения
ты находишь альфа, а потом к альфе прибавляешь угол, который у тебя дан
и смысл этого в том, чтобы сделать
C
1
void far _Cdecl arc(int __x, int __y, int __stangle, int __endangle, int __radius);
то есть
C
1
    arc(Ox, Oy, альфа, альфа+который_дан, r);
откуда у тебя там радианы ?

если у тебя угол дан в радианах, то формула градусы = угол/PI*180
формулу проверил - у тебя правильная
C
1
2
3
4
double radtograd(double frad)
{
    return 180*frad/M_PI;
}
и чего ты тут вот намудрил
Код
    double fs = rad(atan2(y-y1, x1-x));
    arc(x, y, fs, f+fs, r);
угол посчитал правильно а подставил его вообще глючно, какое f ?

надо вот так
C
1
    arc(x, y, fs, fs+f, r);
так оно не просто красивее, оно понятнее
А теперь полностю кодом не могли бы выложить ?? А то чет не все понятно
0
4845 / 3266 / 465
Регистрация: 10.12.2008
Сообщений: 10,569
30.06.2009, 05:59 16
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
 
void Build(int x, int y, int x1, int y1, int f);
double RadToGrad(double frad);
 
int main()
{
    int x,y;
    int x1,y1;
    int f;
    
    printf("Write center coord ");
    scanf("%d %d", &x, &y);
    
    printf("Write start coord ");
    scanf("%d %d", &x1, &y1);
    
    printf("Write angle ");
    scanf("%d", &f);
    
    clrscr();
    Build(x, y, x1, y1, f);
    
    getch();
    return 0;
}
 
void Build(int x, int y, int x1, int y1, int f)
{
    double r;
    double fs;
    int gd, gm;
    
    gd = DETECT;
    gm = 0;
    initgraph(&gd, &gm, "D:\\TC\\BGI");
    
    r = sqrt((x1-x) * (x1-x) + (y1-y) * (y1-y)); /* длина вектора OA */
    fs = RadToGrad(abs(atan((y1-y)/(x1-x))));    /* угол альфа */
    arc(x, y, fs, fs+f, r);
}
 
double RadToGrad(double frad)
{
    return 180*frad/M_PI;
}
не запускал
угол фи ты вводишь, а угол альфа вычисляешь
чертёж доработал, центр для начала в O(0;0), где первый ноль - это x, второй ноль - это y
точка A имеет координаты x1, y1 - A(x1, y1)
1
Миниатюры
Нужно вставить в программу правильную формулу  
4845 / 3266 / 465
Регистрация: 10.12.2008
Сообщений: 10,569
30.06.2009, 06:53 17
ещё добавить
C
1
#include <graphics.h>
может быть запустится, у меня не настроено это дело
1
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
30.06.2009, 17:19  [ТС] 18
Ок спасибо... Впринципе все работает и похоже на правду
0
4845 / 3266 / 465
Регистрация: 10.12.2008
Сообщений: 10,569
01.07.2009, 02:54 19
я сёдня всё таки запустил

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
 
void Build(int x, int y, int x1, int y1, int f);
double RadToGrad(double frad);
 
/* рисует дугу относительно центра экрана */ 
int main()
{
    int x, y;
    int x1, y1;
    int f;
 
    printf("Write center coord ");
    scanf("%d %d", &x, &y);
 
    printf("Write start coord ");
    scanf("%d %d", &x1, &y1);
 
    printf("Write angle ");
    scanf("%d", &f);
 
    clrscr();
    Build(x, y, x1, y1, f);
    getch();
 
    closegraph();
    return 0;
}
 
void Build(int x, int y, int x1, int y1, int f)
{
    double r;
    double fs;
    const int imgx = 320,
          imgy = 240,
              span = 10;
 
    int gd, gm;
    
    gd = DETECT;
    gm = 0;
    initgraph(&gd, &gm, "c:\\inbound\\bc\\bgi");
 
    r = sqrt((x1-x) * (x1-x) + (y1-y) * (y1-y)); /* длина вектора OA */
    fs = RadToGrad(abs(atan((y1-y)/(x1-x))));    /* угол альфа */
    arc(
        imgx+x*span,
        imgy+y*span,
        fs,
        fs+f,
        r*span
    );
}
 
double RadToGrad(double frad)
{
    return 180*frad/M_PI;
}
подкорректировал к центру экрана, оно оказывается рисует в обратную сторону, то есть начинает справа и наращивает окружность влево
для O(0; 0), A(3; 5) и 45 работает нормально
а как начать слева и наращивать вправо я чо-то не допёр, с отрицательным углом вообще ничего не нарисовалось, так что может быть это и возможно, но на данном этапе неизвестно
ты себе путь поправь к драйверу, я просто на c:\ редко что ставлю
1
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
01.07.2009, 20:24  [ТС] 20
ок

Добавлено через 3 часа 59 минут 33 секунды
Цитата Сообщение от accept Посмотреть сообщение
я сёдня всё таки запустил

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
 
void Build(int x, int y, int x1, int y1, int f);
double RadToGrad(double frad);
 
/* рисует дугу относительно центра экрана */ 
int main()
{
    int x, y;
    int x1, y1;
    int f;
 
    printf("Write center coord ");
    scanf("%d %d", &x, &y);
 
    printf("Write start coord ");
    scanf("%d %d", &x1, &y1);
 
    printf("Write angle ");
    scanf("%d", &f);
 
    clrscr();
    Build(x, y, x1, y1, f);
    getch();
 
    closegraph();
    return 0;
}
 
void Build(int x, int y, int x1, int y1, int f)
{
    double r;
    double fs;
    const int imgx = 320,
          imgy = 240,
              span = 10;
 
    int gd, gm;
    
    gd = DETECT;
    gm = 0;
    initgraph(&gd, &gm, "c:\\inbound\\bc\\bgi");
 
    r = sqrt((x1-x) * (x1-x) + (y1-y) * (y1-y)); /* длина вектора OA */
    fs = RadToGrad(abs(atan((y1-y)/(x1-x))));    /* угол альфа */
    arc(
        imgx+x*span,
        imgy+y*span,
        fs,
        fs+f,
        r*span
    );
}
 
double RadToGrad(double frad)
{
    return 180*frad/M_PI;
}
подкорректировал к центру экрана, оно оказывается рисует в обратную сторону, то есть начинает справа и наращивает окружность влево
для O(0; 0), A(3; 5) и 45 работает нормально
а как начать слева и наращивать вправо я чо-то не допёр, с отрицательным углом вообще ничего не нарисовалось, так что может быть это и возможно, но на данном этапе неизвестно
ты себе путь поправь к драйверу, я просто на c:\ редко что ставлю
Неа неправильно(( Препод сказал что с помощью этих подпрограм можно нарисовать любую дугу.imgx, imgy, abs - использовать воопще не нужно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2009, 20:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подскажите какую формулу нужно вставить и как ей воспользоваться
я почти всё сделала, но остаётся заполнить ячейки с количеством. и причём нужно использовать...

Напишите программу, которая переводит правильную дробь в десятичную, выделив (если нужно), период дроби
Напишите программу, которая переводит правильную дробь в десятичную, выделив (если нужно), период...

Вывести формулу и вставить в программу через функцию
Всем привет. Помогите пожалуйста с программированием, ибо я не понимаю его((тема функции. учебник...

Составить правильную формулу подсчета
Привет, всем. Прошу помочь, у меня есть задача, результат которой я визуально вижу, но я не могу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.