Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仿射变换后的丑陋对角线_Java_Awt_Rendering_Antialiasing_Affinetransform - Fatal编程技术网

Java 仿射变换后的丑陋对角线

Java 仿射变换后的丑陋对角线,java,awt,rendering,antialiasing,affinetransform,Java,Awt,Rendering,Antialiasing,Affinetransform,我正在低端设备上绘制图形。我注意到在缩放仿射变换后,许多细线(例如1pxwidth)变得难看。尤其是在对角线的情况下(例如倾斜45度的直线) 我用最明显的示例编写了演示程序(我包括了样板GUI代码,以便您可以运行该示例): 结果是: 正如您从屏幕截图中看到的,在转换后(为了清晰起见,在线条上方标注了比例值),出现了丑陋的断裂。我知道由于缺少抗锯齿,断裂是不可避免的(由于客户的限制,我无法启用抗锯齿)。但我希望结果或多或少是漂亮的,如下图所示(我用红色突出显示了所需的形状): 我试图调整缠绕规

我正在低端设备上绘制图形。我注意到在缩放仿射变换后,许多细线(例如
1px
width)变得难看。尤其是在对角线的情况下(例如倾斜45度的直线)

我用最明显的示例编写了演示程序(我包括了样板GUI代码,以便您可以运行该示例):

结果是:

正如您从屏幕截图中看到的,在转换后(为了清晰起见,在线条上方标注了比例值),出现了丑陋的断裂。我知道由于缺少抗锯齿,断裂是不可避免的(由于客户的限制,我无法启用抗锯齿)。但我希望结果或多或少是漂亮的,如下图所示(我用红色突出显示了所需的形状):


我试图调整缠绕规则,给出提示。但是没有运气。而且,我知道。但这种方法太耗费资源(正如我前面所说,客户的硬件资源非常有限)。还有其他选择吗?

要更快地获得更好的帮助,请添加或。我已发布演示的完整版本。要更快地获得更好的帮助,请添加或。我已发布演示的完整版本。
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.geom.Path2D;

public class DiagonalLinesDemo extends JPanel
{
    public void paintComponent(Graphics g)
    {
        Graphics2D graphics = (Graphics2D) g;
        graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);

        drawRemark(graphics, 1F, 20);
        drawDiagonalLine(graphics, 1F, 0);

        drawRemark(graphics, 1.1070F, 80);
        drawDiagonalLine(graphics, 1.1070F, 60);

        drawRemark(graphics, 1.0162F, 160);
        drawDiagonalLine(graphics, 1.0162F, 140);

        drawRemark(graphics, 1.3300F, 250);
        drawDiagonalLine(graphics, 1.3300F, 160);

        drawRemark(graphics, 1.5555F, 330);
        drawDiagonalLine(graphics, 1.5555F, 180);
    }

    private static void drawDiagonalLine(Graphics2D graphics, float scale, int anchor)
    {
        GeneralPath path = new GeneralPath(Path2D.WIND_EVEN_ODD);
        path.moveTo(anchor + 10, 100);
        path.lineTo(anchor + 60, 50);

        AffineTransform upScaleTransform = new AffineTransform(
                scale,
                0F,
                0F,
                scale,
                0F,
                0F);

        graphics.setTransform(upScaleTransform);

        graphics.setColor(Color.BLACK);
        graphics.draw(path);
    }

    private static void drawRemark(Graphics2D graphics, float scale, int anchor)
    {
        graphics.setTransform(new AffineTransform());
        graphics.setColor(Color.BLUE);
        String remark = String.format("%1.4f", scale);
        graphics.drawString(remark, anchor, 50);
    }

    public static void main(String args[])
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Diagonal Lines Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBackground(Color.white);
        frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);

        DiagonalLinesDemo panel = new DiagonalLinesDemo();
        frame.add(panel);
        frame.setVisible(true);
    }

    private static final int PANEL_WIDTH = 400;
    private static final int PANEL_HEIGHT = 200;
    private static final int FRAME_WIDTH = PANEL_WIDTH + 50;
    private static final int FRAME_HEIGHT = PANEL_HEIGHT + 50;
}