【发布时间】:2014-12-26 05:48:10
【问题描述】:
这是java中的一个代码段,旨在将正方形的坐标A(10,10),B(20,10),C(20,20),D(10,20)的顶点旋转一个角度关于正方形的中心点。正方形的边是 10 点。旋转角度为 90 度。理想情况下,旋转后 A 必须变为 B,B 必须变为 C,C 必须变为 D,D 变为 A。
private Point getRotation(Point start, int side, int rotation){
int x = start.getX();
int y = start.getY();
int pivot_x = x + (side/2);
int pivot_y = y + (side/2);
float angle = (float)Math.toRadians(rotation);
int xR = (int)(pivot_x + (x -pivot_x)*Math.cos(angle) - (y - pivot_y)*Math.sin(angle));
int yR = (int)(pivot_y + (x -pivot_x)*Math.sin(angle) + (y - pivot_y)*Math.cos(angle));
return new Point(xR,yR);
}
public static void main(String[] args) {
Square s = new Square();
Point rotatedPoint1= s.getRotation(new Point(10,10), 10, 90);
System.out.println("{"+rotatedPoint1.getX()+","+rotatedPoint1.getY()+"}");
Point rotatedPoint2= s.getRotation(new Point(20,10), 10, 90);
System.out.println("{"+rotatedPoint2.getX()+","+rotatedPoint2.getY()+"}");
Point rotatedPoint3= s.getRotation(new Point(20,20), 10, 90);
System.out.println("{"+rotatedPoint3.getX()+","+rotatedPoint3.getY()+"}");
Point rotatedPoint4= s.getRotation(new Point(10,20), 10, 90);
System.out.println("{"+rotatedPoint4.getX()+","+rotatedPoint4.getY()+"}");
}
得到的结果不正确
点 A(10,10) 旋转到 (20,10) ---- 正确
点 B(20,10) 旋转到 (30,10) ---- INCORRECT
点 C(20,20) 旋转到 (30,20) ---- 错误
点 D(10,20) 旋转到 (20,20) ---- 不正确
应用的公式是
如果 (h,k) 是点 (x,y) 需要围绕其旋转角度 THETA 的点,则旋转后的坐标 (xR, yR) 为
- xR = h + (x-h)cos(THETA) - (y-k)sin(THETA)
- yR = k + (x-h)sin(THETA) + (y-k)cos(THETA)
问题出在哪里?
【问题讨论】:
-
您想通过
side实现什么目标?您给出的公式是将一个点围绕另一个点旋转给定角度;但是您的方法采用另一个参数side。 -
这是练习用的吗?在任何“现实世界”应用程序中,这应该使用docs.oracle.com/javase/8/docs/api/java/awt/geom/… 完成(但请注意,在任何情况下,点的
int坐标可能会导致一些舍入错误。考虑使用Point2D.Double) -
哦,我明白了。您的
getRotation方法希望是static。这有点令人困惑。 -
@Marco13 你说得对,这可以使用 awt 来完成。由于我没有使用 AWT 或 SWT,因此对将 AWT 引入项目有点担心。确实,从一两天开始,我就一直在脑海中挥之不去的错误,我打算暂时忽略这些错误。但是看到 AffineTranforms 的简单性,我们现在可以考虑。
-
嗨@Marco13 实际上你对舍入误差的担忧是真的,顶点的旋转导致了一个问题。两侧之间的长度发生了显着变化。即使在使用 Point2D.Double 之后。发生这种情况是因为我们需要将 double_x, double_y 转换为 float_x, float_y 以便 iText pdf 库可以使用它,该库需要 x,y 的浮点值来创建一条线。任何解决方案
标签: java math graphics coordinate-transformation