围绕它的中心旋转矩形多边形。 (JAVA)

时间:2014-01-05 17:04:09

标签: java swing matrix rotation polygon

我有这个代码来绘制一个矩形(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);

    }

}

目前,第二个矩形未显示。当我在一个不同的问题中询问这个问题时,有人回答说那是因为它在屏幕之外。

我问如何围绕它的中心旋转矩形,所以新的绘图将出现在屏幕上,他回答但我并不真正理解如何实现他在代码中所说的内容(尝试了不同的事情,没有'工作)。

你能否准确地向我展示代码,如何围绕它的中心旋转矩形?

(当然这不是对象的实际旋转。它正在制作对象的旋转复制品。)

帮助将不胜感激。感谢

2 个答案:

答案 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.xcenter.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不好。

Explanation

答案 1 :(得分:1)

旋转总是发生在0,0左右。

为了围绕物体的中心旋转,您需要移动点,使物体的中心位于0,0;然后旋转它们;然后再将它们移回去:

因此,cxcy是您的中心:

    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);

对其他观点也一样。