首页 文章

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

提问于
浏览
0

这是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)---- INCORRECT

  • 点D(10,20)旋转到(20,20)---- INCORRECT

应用的公式是

如果(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)

问题出在哪儿?

1 回答

  • 3

    问题是你计算方形的质心 .

    它应该是所有四个顶点的相同点 . 但是,在调用函数时,基于每个新对计算为(x 5,y 5) . 那是:

    • 呼唤(10,10),枢轴是(15,15)

    • 呼唤(20,10),枢轴是(25,15)

    • 呼唤(20,20),枢轴是(25,25)

    • 征集(10,20),枢轴是(15,25)

    你应该围绕同一个枢轴(15,15)旋转它们 .

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

相关问题