java - Java围绕另一个点旋转一个点

标签 java math graphics coordinate-transformation

这是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) ---- 错误

  • 点 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)

问题出在哪里?

最佳答案

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

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

  • 要求 (10,10),枢轴为 (15,15)
  • 要求 (20,10),枢轴为 (25,15)
  • 要求 (20,20),枢轴为 (25,25)
  • 要求 (10,20),枢轴为 (15,25)

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

因此,您应该在调用 getRotation() 方法之前计算枢轴,并将预先计算的枢轴作为参数传递,而不是传递边长。

关于java - Java围绕另一个点旋转一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26648722/

相关文章:

java - 解密Android RSA : Invalid Ciphertext Exception

JavaScript 和 Java 在同一个 for 循环中,这可能吗?

c++ - 计算出保存一个 int 需要多少字节的算法

java - 没有在 main 方法中调用 paint() 如何运行?

java - 代码无法正确重绘

python - Python中频谱图的FFT

java - 为什么这个主题不适用于我的应用程序?

java - 回到 Java(IntelliJ IDEA 或 Eclipse)

简单算术的 C++ 和 Octave 结果不同

c++ - 是 VAR |= 1 << 2;可逆的?