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

Rog*_*vis 54 java math geometry

想象一下,你在2d空间中有两个点,你需要将这些点中的一个旋转X度,另一个点作为中心.

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

float dist = FloatMath.sqrt( distX*distX + distY*distY );
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

Ted*_*opp 62

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

  1. 将点1带入原点的翻译
  2. 以所需角度围绕原点旋转
  3. 将点1带回原始位置的翻译

当您全力以赴时,最终会进行以下转换:

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

newY = centerY + (point2x-centerX)*Math.sin(x) + (point2y-centerY)*Math.cos(x);
Run Code Online (Sandbox Code Playgroud)

请注意,这假设x顺时针旋转的角度为负(坐标系的所谓标准或右手方向).如果情况并非如此,那么您需要撤销涉及条款的标志sin(x).

  • @CoreyOgburn - 这是一个基本的平面几何答案.我在OpenGL之前很久才学会了这个:) (9认同)
  • 听起来像一个OpenGL的答案 (2认同)
  • @ mathematician1975 - 逆时针旋转角度应为正,顺时针旋转角度为负.这几乎是一个普遍的标准,除非有明确的陈述(否则).不过,我更新了答案以澄清.谢谢. (2认同)
  • 好,可以.只是认为OP之前可能没有做过什么样的事情,他可能不知道并且不会因为指定惯例而受到伤害. (2认同)

mat*_*975 18

您需要一个二维旋转矩阵http://en.wikipedia.org/wiki/Rotation_matrix

你的新观点将是

 newX = centerX + ( cosX * (point2X-centerX) + sinX * (point2Y -centerY))
 newY = centerY + ( -sinX * (point2X-centerX) + cosX * (point2Y -centerY))
Run Code Online (Sandbox Code Playgroud)

因为你是顺时针旋转而不是逆时针旋转


小智 9

假设您使用的是Java Graphics2D API,请尝试以下代码 -

    Point2D result = new Point2D.Double();
    AffineTransform rotation = new AffineTransform();
    double angleInRadians = (angle * Math.PI / 180);
    rotation.rotate(angleInRadians, pivot.getX(), pivot.getY());
    rotation.transform(point, result);
    return result;
Run Code Online (Sandbox Code Playgroud)

枢轴是你旋转的点.

  • Java中还有`Math.toRadians()`;-) (3认同)