gpt4 book ai didi

java - 如何渲染无间隙的逐像素绘图? Java Swing

转载 作者:行者123 更新时间:2023-12-02 02:47:33 30 4
gpt4 key购买 nike

在Java中,我使用JFrame逐个像素地绘制一些分形,但是drawLine采用int参数并且有像素我无法到达。例如,如果我画一条线:

g.drawLine(0,100,500,100);

然后绘制一条实线。如果我将其绘制为一系列像素:

for (int i=0; i<500;i++) g.drawLine(i,100,i,100);

然后它画一条虚线:两个像素,跳过一个,两个像素,跳过一个,等等

如何修复它,使我的分形花边看起来不像是透过纱门看它? (已填充 4/9 像素)。

我真的很希望框架能够放弃 1.5 倍缩放,只绘制整数,就像我被引导相信的那样,但我也会采取一些其他解决方案,包括一个新的图形包,甚至学习一个具有更好图形控制的新语言。

Java 版本是我上个月下载时的最新版本,在 Windows 10 计算机上通过命令行运行。

示例输出,以便您可以看到“纱门”: RecursiveMobiusMapping

最小工作示例:

import java.util.*;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class Example extends JPanel{
public void paint(Graphics g){
g.setColor(new Color(0,0,0));
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
g.drawLine(i,j,i,j);
}

public static void main(String[] args) {

JFrame f = new JFrame("Inversion");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new Example());
f.setSize(200, 200);
f.setLocation(350, 25);
f.setVisible(true);

}
}

输出:ScreenDoor

最佳答案

我建议不要使用Graphics#drawLine进行像素完美绘画。您给出的坐标被解释为位于您所定位的“像素”的左上角(引号中的像素是因为由于 ui 缩放,GUI 空间中的单个像素实际上可能是屏幕像素或更多的 2x2 网格)。

当描边宽度为1时,假设您正在绘制水平或垂直线,您所绘制的线条将位于两个像素“之间”。根据屏幕分辨率和抗锯齿设置,这将产生不同的结果。

而是使用Graphics#fillRect,例如而不是

g.drawLine(x1, y, x2, y);

用途:

g.fillRect(x1, y, x2 - x1, 1);

绘制单个像素

g.drawLine(x, y, x, y);

绝对是错误的方法。对于Graphics对象来说,这看起来像一条没有长度的线。如果它实际绘制,它完全依赖于跨平台/屏幕/等的实现可能不一致。相反,绘制一个宽度高度1的矩形:

g.fillRect(x, y, 1, 1);

关于java - 如何渲染无间隙的逐像素绘图? Java Swing ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560441/

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