gpt4 book ai didi

java - 绘制多个圆的问题 (drawOval/Java)

转载 作者:行者123 更新时间:2023-11-29 05:12:27 26 4
gpt4 key购买 nike

我的问题如下:我的实际项目(下面的代码是其简化版本)涉及许多同心圆(每个都有不同的颜色)和使用计时器的动画。这些圆是使用 drawOval 方法绘制的。

我的问题是,当绘制这些同心圆时,这些圆的轮廓中似乎存在大量间隙,我猜测这与圆由像素和线组成的事实有关是任何形状,所以圆形的外观是一种错觉。我这样说是因为当我将 drawOval 方法替换为 drawRect 时,绘画看起来就像您期望的那样。

当弄乱其他人的代码时,我看到使用 RenderingHints 以某种方式解决了这个问题,但是减慢了动画速度,超出了我认为可以接受的程度。

下面是绘制内容的截图。我们看到的不是实心不透明圆圈(因为在此示例中绘制的所有圆圈都具有相同的颜色):

what we actually see

这是我的简化代码:

测试10

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class Test10 extends JPanel {
Circle[] circles;
public static void main(String[] args) {
new Test10().go();
}
void go() {
JFrame frame = new JFrame("Circle Test");
frame.getContentPane().add(this);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
circles = new Circle[200];
for (int i = 0; i < 200; i++) {
circles[i] = new Circle(i, ((2 * ( 200 - i) + 1)));
}
repaint();
frame.setPreferredSize(new Dimension(500,500));
frame.pack();
frame.setVisible(true);
}
public void paintComponent(Graphics g) {
for (Circle circle : circles ) {
circle.draw(g);
}
}
}

圆圈

import java.awt.Graphics;    
public class Circle {
int topLeft;
int diameter;
public Circle(int topLeft, int diameter) {
this.topLeft = topLeft;
this.diameter = diameter;
}
void draw(Graphics g) {
g.drawOval(topLeft, topLeft, diameter, diameter);

}
}

任何人都可以向我解释 a) 为什么会发生这种情况以及 b) 如何克服这个问题。


更新
尝试了各种方法,包括从最外圈开始,使用 fillOval 代替 drawOval,以及使用更高的 stroke 值,我仍然发现我有出现类似于 Pavel 发布的屏幕截图的某些人工制品的问题。这是我运行动画的完整应用程序的屏幕截图,如果仔细观察,您会发现几乎所有给定圆圈的颜色都不一致,从而导致这些奇怪的结果。它们的分布实际上遵循与上面发布的屏幕截图相同的模式,因此很明显这些选项没有解决一些基本问题。这是我的屏幕截图: my full application in action

最佳答案

不可能画出完美的圆。

尝试使用下面的方法

public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(2));
int i = 0;
for (Circle circle : circles ) {
Shape circle2 = new Ellipse2D.Double(i++, i, circle.diameter, circle.diameter);
g2d.draw(circle2);
}
}

你说你试过使用RenderingHints,它减慢了你的动画,但你没有给我们任何动画代码,所以也许试试我的代码(看到动画实现会很好) .它看起来更好,但仍然不是你想要的。将 stroke 设置为另一个值将解决此问题(至少设置为 2)。另一种是使用 .fill() 而不是 .draw()。我知道它并不完美,但你可以尝试一下。

另一个想法

我想,也许您可​​以为您的图像添加一些模糊,这样这些伪影就看不见了?我以前没做过,但我发现了这个 ( found HERE ):

private class BlurGlass extends JComponent {
private JFrame f;

public BlurGlass(JFrame f) {
this.f = f;
setOpaque(false);
setFocusable(false);
}

public void paintComponent(Graphics g) {
int w = f.getWidth();
int h = f.getHeight();
setLocation(0, 0);
setSize(w, h);
g.setColor(new Color(0, 0, 0, 0.3f));
g.fillRect(0, 0, w, h);
}
}

现在在 go() 方法的某处:

frame.setGlassPane(new BlurGlass(frame));
frame.getGlassPane().setVisible(true);

我看起来好多了。尝试使用此 GlassPane 颜色(尝试将 .3f 更改为其他值)。

enter image description here

关于java - 绘制多个圆的问题 (drawOval/Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27902791/

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