我正在尝试围绕向量上的某一点旋转该向量(使用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) 旋转
答案取决于你的坐标系。
(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
感谢mmx在Pesto的帖子中提供的评论,以及SkeletorFromEterenia指出我的实现中的错误。
dx = x of rotation center
dy = y of rotation center
V2 = V - [dx, dy, 0]
V3 = V2 * rotation matrix
Result = V3 + [dx, dy, 0]
假设您正在使用标准的向量实现,其中(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))
我发现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;