我已经有了通过角度θ旋转(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)。
答案 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。