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
最简单的方法是组合三个转换:
当您全力以赴时,最终会进行以下转换:
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)
.
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)
枢轴是你旋转的点.