gpt4 book ai didi

java - 围绕指定点旋转 Java 2D 图形

转载 作者:行者123 更新时间:2023-12-02 11:20:21 25 4
gpt4 key购买 nike

我正在尝试编写一个程序来绘制围绕中心点旋转的多个形状。结果应该类似于螺旋描记器。我正在尝试使用矩形来测试它,但我只能让其中两个出现在窗口中。其中一个在它应该在的位置,但在第一次旋转后,它把另一个正方形扔到了窗口的左上角。它应该围绕中心点旋转和绘制。这是我的代码的一部分。

import java.awt.*;
import java.awt.geom.Ellipse2D;

import javax.swing.JPanel;

public class Shapes extends JPanel
{
private double angle;
private int type;
private int radius;
private int repeats;

public Shapes(int t, int r, int z)
{
type = t;
radius = r;
repeats = z;
angle = 360 / repeats;
}

public void paintComponent( Graphics g )
{
super.paintComponent( g );
Graphics2D g2d = (Graphics2D)g;

g.setColor(Color.red);

int centerX = getWidth()/2;
int centerY = getHeight()/2;

double curAngle = 0;

for(int i=0; i<=repeats; i+=1)
{
g.setColor(Color.blue);

Rectangle tangle = new Rectangle(0, 0, radius, radius);
g2d.rotate(Math.toRadians(curAngle));
g2d.translate(centerX, centerY);
g2d.draw(tangle);
curAngle += angle;
}

}

最佳答案

请记住,平移旋转是复合的,也就是说,每次应用它们时,它们都会添加到当前转换中。

您可以通过多种方法来实现此目的,但首先,我们需要创建 Graphics 上下文的副本。任何时候当你搞乱转换时,这一点都很重要,特别是,你可以使用 Graphics 上下文的副本来执行此操作,因为这将使原始内容不受影响(并且不会影响任何可能绘制的内容)之后)

Graphics2D g2d = (Graphics2D) g.create();
//...
g2d.dispose();

因此,您现在对 g2d 执行的任何操作都不会影响 g 的状态

现在,我们可以利用变换的“复合”效果来发挥我们的优势

Rectangle tangle = new Rectangle(0, 0, radius, radius);
//g2d.translate(centerX, centerY);
g2d.rotate(Math.toRadians(angle), centerX, centerY);
g2d.draw(tangle);

因此,这一切所做的就是将 angle 的值应用于每个循环上的 Graphics 上下文的副本。 anchor 设置为 centerXcenterY

Spiral 01

好吧,看起来不错,但是如果我调整窗口大小会发生什么?

Spiral 02

好吧,这并不是我所期待的。发生这种情况的原因有多种,形状的大小、 anchor 、旋转、平移偏移,这些因素综合起来产生效果(虽然很酷)。

好吧,我们可以简单地为每个循环创建一个新的转换,提供我们想要的确切参数,例如......

Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.blue);

Rectangle tangle = new Rectangle(0, 0, radius, radius);
g2d.translate(centerX, centerY);
g2d.rotate(Math.toRadians(curAngle));
g2d.draw(tangle);
curAngle += angle;
g2d.dispose();

这现在产生...

Spiral 03

在使用代码时,我注意到随着重复次数的增加,我没有得到预期的结果。

经过同样的挖掘,我改变了

angle = 360 / repeats;

angle = 360.d / repeats;

它停止了整数除法问题(以及截断小数值)并开始产生所需的结果

简单的前后比较...

Before After

关于java - 围绕指定点旋转 Java 2D 图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513508/

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