这是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)---- INCORRECT
D(10,20)点旋转至(20,20)----不正确
应用的公式是
如果(h,k)是点(x,y)需要以角度THETA旋转的点,那么旋转后的坐标(xR,yR)是
问题出在哪里?
答案 0 :(得分:3)
问题在于你计算方形的质心。
它应该是所有四个顶点的相同点。但是,在调用函数时,基于每个新对计算为(x + 5,y + 5)。那就是:
你应该围绕同一个枢轴(15,15)旋转它们。
所以你应该在调用getRotation()
方法之前计算枢轴,并将预先计算的枢轴作为参数传递,而不是传递边长。