如何在C中围绕(0,0)旋转像素/点?

时间:2017-01-20 17:55:46

标签: c rotation linear algebra

我已经有了通过角度θ旋转(px,py)(ox,oy)的公式:

p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy

但是当我将theta设置为:

double theta = 5 * PI / 180;

当我将theta设置为:

时,我的观点仍然停留在起始点link: (5, 5)
double theta = 6 * PI / 180;

它开始像link: square一样旋转。我知道这应该发生,因为命令提示符就像一个巨大的监视器,并且不能有一个圆圈,但是如何让它旋转我设置的任何一点?例如,当我的点为link: (2, 2)时,上面的6 * PI / 180不起作用。

编辑:ox,oy是(0,0)。

1 个答案:

答案 0 :(得分:2)

您没有显示您的代码,但我猜您的代码如下所示:

int x = 5;
int y = 5;
double a = 6 * PI / 180;
int i;

for (i = 0; i < 72; i++) {
    int xx = round(x);
    int yy = round(y);

    putpixel(xx, yy, '*');

    x = round(xx * cos(a) - yy * sin(a));
    y = round(xx * sin(a) + yy * cos(a));
}

变量也可以是double,但重要的是你可以根据你的半径和角度对你进行舍入,取消你旋转所覆盖的距离。我可以使用上面的代码重现您显示的屏幕截图。

解决方案是保持整个小数浮点值并仅转换为整数以进行打印:

double x = 5.0;                 // unrounded actual coordinates
double y = 5.0;
double a = 5 * PI / 180;
int i;

for (i = 0; i < 72; i++) {
    int ix = rint(x);           // temporary integers for plotting
    int iy = rint(y);
    double nx, ny;              // temporary variables for update

    putpixel(x, y, '*');

    nx = x * cos(a) - y * sin(a);
    ny = x * sin(a) + y * cos(a);

    x = nx;
    y = ny;
}

这给出了一个漂亮的圆形圆圈。如果要绘制带整数坐标的像素圆,请查看Midpoint algorithm