【问题标题】:Rotating a point around another point Java围绕另一个点旋转一个点Java
【发布时间】: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


【解决方案1】:

问题在于您对正方形质心的计算。

所有四个顶点都应该是同一个点。但是,当您调用该函数时,您会根据每个新对计算为 (x+5,y+5)。那就是:

  • 调用 (10,10),支点为 (15,15)
  • 调用 (20,10),支点为 (25,15)
  • 调用 (20,20),支点为 (25,25)
  • 调用 (10,20),支点为 (15,25)

您应该将它们全部围绕同一个轴 (15,15) 旋转。

所以你应该在调用getRotation()方法之前计算轴心,并将预先计算的轴心作为参数传递,而不是传递边的长度。

【讨论】:

  • 是的,我认为这是我犯的错误。感谢您指出。
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
相关资源
最近更新 更多