15

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

4

5 回答 5

32

答案取决于您的坐标系。

计算机图形坐标系,(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强调我的实现中的一个错误。

于 2009-04-01T13:26:40.580 回答
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]
于 2009-03-06T22:47:47.187 回答
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 值随着您下降而增加。

于 2009-03-06T22:51:08.787 回答
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;

当然,这可以进一步缩短,但我想让它尽可能简单。

于 2015-03-16T11:40:49.733 回答
1

您将需要使用平移矩阵来围绕不同的点移动旋转。

于 2009-03-06T22:49:04.860 回答