C++:围绕特定点旋转向量

17

我正在尝试围绕向量上的某一点旋转该向量(使用C++):

1 2 3
4 5 6
7 8 9

绕点 (1,1)(也就是 "5")旋转 90 度会得到:

7 4 1
8 5 2
9 6 3

现在我正在使用:

x = (x * cos(90)) - (y * sin(90))
y = (y * cos(90)) + (x * sin(90))

但我不希望它围绕 (0,0) 旋转


1
请发布一些C++代码,以说明您要做什么。 - anon
5个回答

36

答案取决于你的坐标系。

计算机图形学坐标系,(0,0)左上角

如果你使用的是计算机图形矢量实现,其中 (0,0)左上角,并且你正在围绕点 (dx, dy) 旋转,则旋转计算(包括返回原始坐标系的平移)如下:

x_rotated =      ((x - dx) * cos(angle)) - ((dy - y) * sin(angle)) + dx
y_rotated = dy - ((dy - y) * cos(angle)) + ((x - dx) * sin(angle))

物理/数学坐标系,(0,0)位于左下角

如果您使用传统的现实世界坐标系,其中(0,0)左下角,那么绕点(dx, dy)旋转计算,包括回到原始坐标系的平移操作,将如下进行:

x_rotated = ((x - dx) * cos(angle)) - ((y - dy) * sin(angle)) + dx
y_rotated = ((x - dx) * sin(angle)) + ((y - dy) * cos(angle)) + dy

感谢mmxPesto的帖子中提供的评论,以及SkeletorFromEterenia指出我的实现中的错误。


也许是个愚蠢的问题,但左上角的坐标系是否可以与左下角的定义一起使用?举个愚蠢的例子,假设我想将9,9绕10,10旋转45度。现在设定期望值,9,9与10,10之间有-45度。+45度旋转使中心和旋转向量之间的距离为0,因此我期望x=10,y=10-向量长度。而“标准方程式给了我这个”,有一件事,即默认旋转是逆时针的,但在这里我像顺时针一样工作。最后一个问题,标准方程式能否适用于默认旋转为顺时针的左上角坐标系? - viceriel
你可以编写软件以同时处理多个坐标系,但我建议不要这样做,因为很容易混淆,并且会大大扩展测试数据集。@viceriel - Mark Booth

11
解决方法是将向量转换到一个坐标系中,使得旋转中心为(0,0)。应用旋转矩阵后,将向量再转回原始坐标系。
dx = x of rotation center  
dy = y of rotation center

V2 = V - [dx, dy, 0]  
V3 = V2 * rotation matrix  
Result = V3 + [dx, dy, 0]

4

假设您正在使用标准的向量实现,其中(0,0)是左上角,并且您正在围绕点(x_origin,y_origin)旋转,则应执行以下操作:

x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))

请注意,y值是“y_origin - y”,因为随着向下移动,y值会增加。

8
转换后您需要将其翻译回来。得到的 (x, y) 不在原始坐标系中。 - Mehrdad Afshari

2

我发现Mark Booth的答案是错误的(使用他的公式将(0,1,0)旋转0度,得到的应该是(0,-1,0)),我最终得出的答案是:

double cs = cos_deg(new_degrees);
double sn = sin_deg(new_degrees);

double translated_x = x - x_origin;
double translated_y = y - y_origin;
    
double result_x = translated_x * cs - translated_y * sn;
double result_y = translated_x * sn + translated_y * cs;
    
result_x += x_origin;
result_y += y_origin;

这当然可以进一步简化,但我想让它尽可能简单易懂。

感谢指出错误,我已经更新了我的答案,并详细说明了您使用的坐标系意味着您需要与Pesto提出的解决方案不同的解决方案。 - Mark Booth

1

您需要使用翻译矩阵来围绕不同的点进行移动和旋转。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接