如何在没有间隙的情况下逐像素绘制像素?Java Swing

And*_*rea 2 java graphics swing pixel

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

g.drawLine(0,100,500,100);
Run Code Online (Sandbox Code Playgroud)

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

for (int i=0; i<500;i++) g.drawLine(i,100,i,100);
Run Code Online (Sandbox Code Playgroud)

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

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

我真的很喜欢这个框架放弃 1.5 倍的缩放比例,只绘制整数,就像我相信的那样,但我也会采取其他一些解决方案,包括一个新的图形包,甚至学习一门新语言更好的图形控制。

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

示例输出,以便您可以看到“屏蔽门”: 递归莫比乌斯映射

最小工作示例:

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);
 
     }
}
Run Code Online (Sandbox Code Playgroud)

输出:屏风门

wei*_*isj 5

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

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

而是使用Graphics#fillRect例如代替

g.drawLine(x1, y, x2, y);
Run Code Online (Sandbox Code Playgroud)

用:

g.fillRect(x1, y, x2 - x1, 1);
Run Code Online (Sandbox Code Playgroud)

绘制单个像素

g.drawLine(x, y, x, y);
Run Code Online (Sandbox Code Playgroud)

绝对是不正确的方法。对于Graphics对象来说,这看起来像是一条没有长度的线。如果它真的绘制它完全依赖于跨平台/屏幕/等可能不一致的实现。而是绘制一个具有widthheight的矩形1

g.fillRect(x, y, 1, 1);
Run Code Online (Sandbox Code Playgroud)