C ++:围绕某个点旋转矢量

时间:2009-03-06 22:44:05

标签: c++ vector rotation

我正在尝试围绕向量上的某个点旋转向量(在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)旋转

5 个答案:

答案 0 :(得分:27)

正如Mehrdad AfshariPesto帖子发表的评论,包括翻译回原始坐标系统将是:

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

答案 1 :(得分: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]

答案 2 :(得分: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值随着你的下降而增加。

答案 3 :(得分:1)

您需要使用translation matrix来旋转不同的点。

答案 4 :(得分:1)

我发现Marc 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;

当然可以进一步简化,但我希望尽可能简单。