c - 为什么我的线条以一种特殊的方式旋转?

标签 c bgi

我正在尝试用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();
}

问题在于线路不以同步方式旋转。这就像一条线正在旋转,然后一段时间后第二条线开始旋转,依此类推。有人可以帮我吗?

最佳答案

根据您的编译器,您可能会看到如下警告:

'=': conversion from 'double' to 'int', possible loss of data

这几乎可以告诉您发生了什么。您将坐标声明为 int,但三角函数产生 double。准确地说,非常小。 int 只是无法捕获这些微小的变化,并且一旦您对 xr 等进行赋值,就会丢弃小数点后的任何数字。

要解决此问题,只需将变量声明为 double 即可。然后,您可以将它们转换为 int,然后再将它们传递给 line()。但是您将计算保持在精度:

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

解决此问题的另一种方法是增加角度并根据原始值计算旋转方向,如 3Dave 在评论中建议的那样。

这里的主要信息是:不要忽略编译器给您的警告。

关于c - 为什么我的线条以一种特殊的方式旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58120660/

相关文章:

c - 如何在特定区域画圆?

c - 将字符串变量传递给包含 C 中的 system() 命令的函数

c - 打印两个索引之间的所有字母字符

生成静态输出的 C 图形程序

c - C中的除法错误

c - 图形(二维旋转)

c - 如何使用外部文件作为主程序的一部分?

c - USB编程教程

c++ - 将 5x5 矩阵减少到 c 中的 25 元素数组

c - 如何使用graphics.h函数用c实现弹跳球?