Почему мои линии вращаются особым образом? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь создать вентилятор и заставить линии вращаться, используя язык C.

Это мой код:

#include<stdio.h>
#include<graphics.h>
#include<math.h>

void main(){
    int gd=DETECT,gm=0,xr,yr,xr1,yr1,xr2,yr2,x,y,x1,y1,x2,y2;
    int x3,y3,i;
    float rad;
    initgraph(&gd,&gm,"C:\\TURBOC3\\BGI");
    x=getmaxx()/2;
    y=getmaxy()/2;
    printf("x1 and y1:");
    scanf("%d %d",&x1,&y1);
    printf("x2 and y2:");
    scanf("%d %d",&x2,&y2);
    printf("x3 and y3:");
    scanf("%d %d",&x3,&y3);
    printf("\n\n");
    setcolor(RED);
    line(x,y,x1,y1);
    line(x,y,x2,y1);
    line(x,y,x3,y3);
    rad=toRadians(1);

    for(i=0;i<60;i++){

        xr=x+((x1-x)*cos(0.017)-(y1-y)*sin(0.017));
        yr=y+((x1-x)*sin(0.017)+(y1-y)*cos(0.017));
        xr1=x+((x2-x)*cos(0.017)-(y2-y)*sin(0.017));
        yr1=y+((x2-x)*sin(0.017)+(y2-y)*cos(0.017));
        xr2=x+((x3-x)*cos(0.017)-(y3-y)*sin(0.017));
        yr2=y+((x3-x)*sin(0.017)+(y3-y)*cos(0.017));
        setcolor(RED);
        line(x,y,xr,yr);
        line(x,y,xr1,yr1);
        line(x,y,xr2,yr2);
        x1=xr;
        y1=yr;
        x2=xr1;
        y2=yr1;
        x3=xr2;
        y3=yr2;
        delay(500);
        cleardevice();

    }

    getch();
    closegraph();
}

Проблема в том, чтолинии не вращаются синхронно.Это как одна линия вращается, потом через некоторое время начинает вращаться вторая строка и так далее.Может кто-нибудь помочь мне?

1 Ответ

1 голос
/ 27 сентября 2019

В зависимости от вашего компилятора вы можете увидеть следующее предупреждение:

'=': преобразование из 'double' в 'int', возможная потеря данных

Это в значительной степени говорит вам, что происходит.Вы объявили свои координаты как int, но тригонометрические функции выдают double.Очень маленькие, если быть точным.int просто не в состоянии зафиксировать эти небольшие изменения и выбросит любую цифру после десятичной точки, как только вы сделаете присваивание xr и т. Д.

Чтобы решить эту проблему, просто объявите свои переменные какdouble.Затем вы можете преобразовать их в int перед передачей их в line().Но вы сохраняете свои вычисления с точностью double:

line((int)round(x), (int)round(y), (int)round(xr), (int)round(yr));
...

Еще один способ обойти эту проблему - увеличить угол и вычислить повернутые направления из исходных значений, как предложено в 3Dave в комментариях.

Основное сообщение здесь: «Не игнорируйте предупреждения, которые выдает ваш компилятор.

...