gpt4 book ai didi

java - 围绕它的中心旋转一个矩形多边形。 ( java )

转载 作者:搜寻专家 更新时间:2023-11-01 04:06:01 25 4
gpt4 key购买 nike

我有这段代码来绘制一个矩形(多边形对象),然后使用旋转矩阵绘制另一个旋转 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);

}

}

目前,第二个矩形没有出现。当我在另一个问题中问到这个问题时,有人回答说那是因为它绘制在屏幕之外。

我问如何围绕它的中心旋转矩形,这样新的绘图就会出现在屏幕上,他回答了,但我真的不明白如何实现他在代码中所说的(尝试了不同的东西'不工作)。

你能在代码中准确地告诉我,如何围绕它的中心旋转矩形吗?

(当然,这并不是真正的对象旋转。它是在旋转对象的副本)。

帮助将不胜感激。谢谢

最佳答案

由于您尝试围绕矩形的中心旋转,因此首先需要将矩形平移到原点,然后应用旋转并最后平移回来。请参阅 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

关于java - 围绕它的中心旋转一个矩形多边形。 ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20936429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com