Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
#1

Нужно вставить в прогу правильную формулу(С++) - C++

27.06.2009, 23:55. Просмотров 1826. Ответов 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)
Конечный угл: стартовый + угл поворота

Как это сделать??Заранее спасибо!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.06.2009, 06:14     Нужно вставить в прогу правильную формулу(С++) #2
о, и тут пропало, где рекомендовали заменить sinh на sin
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
28.06.2009, 17:39  [ТС]     Нужно вставить в прогу правильную формулу(С++) #3
Цитата Сообщение от accept Посмотреть сообщение
о, и тут пропало, где рекомендовали заменить sinh на sin
Та знаю что рекомендовали но это было неправильно
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.06.2009, 09:23     Нужно вставить в прогу правильную формулу(С++) #4
тут формула тангенса на графике, арктангенс вычисляет угол, из которого выведен тангенс
Миниатюры
Нужно вставить в прогу правильную формулу(С++)  
Невик
3 / 3 / 1
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 10:46     Нужно вставить в прогу правильную формулу(С++) #5
Замени гиперболический синус на обычный
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
29.06.2009, 15:00  [ТС]     Нужно вставить в прогу правильную формулу(С++) #6
Цитата Сообщение от Невик Посмотреть сообщение
Замени гиперболический синус на обычный
А ты не мог бы кодом показать
Невик
3 / 3 / 1
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 15:04     Нужно вставить в прогу правильную формулу(С++) #7
double fs=rad(sin(fi)); вместо double fs=rad(sinh(fi));
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
29.06.2009, 21:41  [ТС]     Нужно вставить в прогу правильную формулу(С++) #8
Цитата Сообщение от Невик Посмотреть сообщение
double fs=rad(sin(fi)); вместо double fs=rad(sinh(fi));
Спасибо но это мне уже предлагали, это не правильный ответ
Невик
3 / 3 / 1
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 22:21     Нужно вставить в прогу правильную формулу(С++) #9
Цитата Сообщение от Alex1991 Посмотреть сообщение
Спасибо но это мне уже предлагали, это не правильный ответ
Вообще убери синус. В rad() подставляется угол, а не его синус.
Alex1991
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);
}
и я неправ ??
Невик
3 / 3 / 1
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 22:49     Нужно вставить в прогу правильную формулу(С++) #11
Правильно double fs=rad(abs(atan(y/x)-atan(y1/x1)));
Alex1991
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);
}
Невик
3 / 3 / 1
Регистрация: 23.01.2009
Сообщений: 18
29.06.2009, 23:52     Нужно вставить в прогу правильную формулу(С++) #13
Проверь по результату. Должно быть так.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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);
так оно не просто красивее, оно понятнее
Alex1991
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);
так оно не просто красивее, оно понятнее
А теперь полностю кодом не могли бы выложить ?? А то чет не все понятно
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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)
Миниатюры
Нужно вставить в прогу правильную формулу(С++)  
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.06.2009, 06:53     Нужно вставить в прогу правильную формулу(С++) #17
ещё добавить
C
1
#include <graphics.h>
может быть запустится, у меня не настроено это дело
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
30.06.2009, 17:19  [ТС]     Нужно вставить в прогу правильную формулу(С++) #18
Ок спасибо... Впринципе все работает и похоже на правду
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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:\ редко что ставлю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2009, 20:24     Нужно вставить в прогу правильную формулу(С++)
Еще ссылки по теме:

даны 2 последовательности в файлах, в двух разных, нужно их обьединить и отсортировать по возрастанию. Но нужно сделать прогу с помошью указателей C++
Нужно запрограммировать формулу C++
Сколько нужно убрать из данной последовательности скобок, чтобы получить правильную последовательность? C++
Нужно вставить формулу в программу C++
Кто знает как исправить формулу и запустить прогу C++

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

Или воспользуйтесь поиском по форуму:
Alex1991
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 - использовать воопще не нужно
Yandex
Объявления
01.07.2009, 20:24     Нужно вставить в прогу правильную формулу(С++)
Ответ Создать тему
Опции темы

Текущее время: 20:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru