我有这个代码来绘制一个矩形(Polygon对象),然后使用旋转矩阵绘制另一个原始矩形,旋转90度。
public class DrawingPanel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
Point p1,p2,p3,p4;
p1 = new Point(50,50);
p2 = new Point(200,50);
p3 = new Point(200,100);
p4 = new Point(50,100);
int[] x = {(int) p1.getX(), (int) p2.getX(), (int)p3.getX(), (int) p4.getX()};
int[] y = {(int) p1.getY(), (int) p2.getY(), (int)p3.getY(), (int) p4.getY()};
Polygon poly = new Polygon(x, y, x.length);
g2d.draw(poly);
p1.setLocation(p1.getX() * Math.cos(Math.toRadians(90)) - p1.getY() * Math.sin(Math.toRadians(90)),
p1.getX() * Math.sin(Math.toRadians(90)) + p1.getY() * Math.cos(Math.toRadians(90)));
p2.setLocation(p2.getX() * Math.cos(Math.toRadians(90)) - p2.getY() * Math.sin(Math.toRadians(90)),
p2.getX() * Math.sin(Math.toRadians(90)) + p2.getY() * Math.cos(Math.toRadians(90)));
p3.setLocation(p3.getX() * Math.cos(Math.toRadians(90)) - p3.getY() * Math.sin(Math.toRadians(90)),
p3.getX() * Math.sin(Math.toRadians(90)) + p3.getY() * Math.cos(Math.toRadians(90)));
p4.setLocation(p4.getX() * Math.cos(Math.toRadians(90)) - p4.getY() * Math.sin(Math.toRadians(90)),
p4.getX() * Math.sin(Math.toRadians(90)) + p4.getY() * Math.cos(Math.toRadians(90)));
int[] x2 = {(int) p1.getX(), (int) p2.getX(), (int)p3.getX(), (int) p4.getX()};
int[] y2 = {(int) p1.getY(), (int) p2.getY(), (int)p3.getY(), (int) p4.getY()};
Polygon poly2 = new Polygon(x2, y2, x2.length);
g2d.draw(poly2);
}
}
目前,第二个矩形未显示。当我在一个不同的问题中询问这个问题时,有人回答说那是因为它在屏幕之外。
我问如何围绕它的中心旋转矩形,所以新的绘图将出现在屏幕上,他回答但我并不真正理解如何实现他在代码中所说的内容(尝试了不同的事情,没有'工作)。
你能否准确地向我展示代码,如何围绕它的中心旋转矩形?
(当然这不是对象的实际旋转。它正在制作对象的旋转复制品。)
帮助将不胜感激。感谢
答案 0 :(得分:13)
由于您尝试围绕矩形的中心旋转,首先需要将矩形转换为原点,然后应用旋转并最终转换回来。请参阅另一篇文章中this answer的以下代码(适合您的情况)。
//TRANSLATE TO ORIGIN
double x1 = p1.getX() - center.x;
double y1 = p1.getY() - center.y;
//APPLY ROTATION
double temp_x1 = x1 * Math.cos(angle) - y1 * Math.sin(angle));
double temp_y1 = x1 * Math.sin(angle) + y1 * Math.cos(angle));
//TRANSLATE BACK
p1.setLocation(temp_x1 + center.x, temp_y1 + center.y);
您必须为每个点执行此操作。您还需要找到矩形center.x
和center.y
的中心。
<强>解释强>
当您直接应用旋转时,您将围绕原点(0,0)
旋转它(当您在代码中更改角度旋转时,可以很容易地看到这一点)。如果要围绕矩形的中心旋转,则必须按照上述步骤进行操作。
(0,0)
周围的翻译点应用旋转。修改1:
假设我们有一个矩形(正方形),顶点是:
p1: (2, 2)
p2: (3, 2)
p3: (3, 3)
p4: (2, 3)
对于点p2
:
第一步:
center: (2.5, 2.5)
x1 = 3 - 2.5 = 0.5
y1 = 2 - 2.5 = -0.5
为每一点执行此操作:
new_p1: (-0.5, -0.5)
new_p2: (0.5, -0.5)
new_p3: (0.5, 0.5)
new_p4: (-0.5, 0.5)
然后你应用轮换......
编辑2:我希望这张图片更加清晰,抱歉,如果我对Paint不好。
答案 1 :(得分:1)
旋转总是发生在0,0左右。
为了围绕物体的中心旋转,您需要移动点,使物体的中心位于0,0;然后旋转它们;然后再将它们移回去:
因此,cx
和cy
是您的中心:
p1.setLocation((p1.getX()-cx) * Math.cos(Math.toRadians(90)) - (p1.getY()-cy) * Math.sin(Math.toRadians(90))+cx,
(p1.getX()-cx) * Math.sin(Math.toRadians(90)) + (p1.getY()-cy) * Math.cos(Math.toRadians(90))+cy);
对其他观点也一样。