如何围绕某个点旋转顶点?

2022-08-31 16:22:08

假设您在 2D 空间中有两个点,您需要将其中一个点旋转 X 度,另一个点充当中心。

float distX = Math.abs( centerX -point2X );
float distY = Math.abs( centerY -point2Y );

float dist = FloatMath.sqrt( distX*distX + distY*distY );

到目前为止,我只是找到了两点之间的距离......任何想法,我应该从哪里去?

enter image description here


答案 1

最简单的方法是组合三个转换:

  1. 将第 1 点带到原点的翻译
  2. 绕原点旋转所需角度
  3. 将点 1 恢复到其原始位置的翻译

当您解决这一切时,您最终会得到以下变换(其中以弧度为单位的所需旋转角度):x

newX = centerX + (point2x-centerX)*Math.cos(x) - (point2y-centerY)*Math.sin(x);

newY = centerY + (point2x-centerX)*Math.sin(x) + (point2y-centerY)*Math.cos(x);

请注意,这假设顺时针旋转的角度为负(坐标系的标准或右侧方向)。如果不是这种情况,那么您将需要反转涉及 的条款上的符号。xsin(x)


答案 2

您需要一个 2-d 旋转矩阵 http://en.wikipedia.org/wiki/Rotation_matrix

您的新观点将是

 newX = centerX + ( cosX * (point2X-centerX) + sinX * (point2Y -centerY))
 newY = centerY + ( -sinX * (point2X-centerX) + cosX * (point2Y -centerY))

因为您正在顺时针旋转而不是逆时针旋转