繁体   English   中英

AWT 绘制浮点矩形

[英]AWT Draw Floating-Point Rect

在我的 AWT 画布中,我想在坐标 (0.5, 0.5) 处绘制一个矩形。 不幸的是, fillRect()方法只接受整数。 我被迫强制转换我的浮点变量以使其完全运行。

正确:因为画布坐标以像素为单位,所以 0.5 无关紧要,因为您不能有半个像素。 但是,当我将所有内容都缩放 50 时,我可以轻松地分辨出矩形不是我想要的位置。

如果您打算回答“为什么首先要放大所有内容?”,我想将我的物理引擎坐标转换为画布坐标。 例如:世界坐标中 (1, 0) 处的实体在大小为 600x600 的画布上的画布坐标中应为 (400, 300)。 这不是关键,但我非常感谢一种制作浮点矩形的方法。 或者更好的方法来转换坐标。

提前致谢!

您正在寻找java.awt.geom.Rectangle2D.Double 这允许您在十进制坐标处绘制。

Rectangle2D.Double rect = new Rectangle2D.Double(.5, .5, 4, 6);

在坐标为 (.5, .5) 且维度为 (4, 6) 处创建一个矩形。 您应该使用Graphics2D绘制它。 以下是将Graphics g转换为Graphics2D对象然后绘制矩形的方法:

Graphics2D g2d = (Graphics2D)g.create();
g2d.draw(rect);

我一直“批评”我的评论“像素没有分数,这根本不可能。” 不“准确”

所以,让我们专注于一个简单的例子......

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();

            g2d.setColor(Color.LIGHT_GRAY);
            for (int x = 0; x < getWidth(); x += 2) {
                for (int y = 0; y < getHeight(); y += 2) {
                    g2d.drawLine(x, y, x, getHeight());
                    g2d.drawLine(x, y, x + getWidth(), y);
                }
            }

            g2d.setColor(Color.RED);
            Rectangle2D.Double rect = new Rectangle2D.Double(10.5, 10.5, 10.5, 10.5);
            g2d.draw(rect);
            g2d.dispose();
        }

    }
}

上面的代码产生类似......

实心像素

因此,默认情况下,Swing 中不启用抗锯齿。 所以在上面的例子中,矩形从10x10开始,大小为11x11像素

如果我们修改代码以包含(在我的测试中,这是在绘制网格的代码下方和绘制矩形的代码之前完成的)...

g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

这产生...

模糊

矩形仍然从10x10开始,但现在有一个“alpha”组件,它以 1 个像素的大小延伸到10x10之外,在它的右侧和底部。

Sooo,我的意思是。 一个像素是 AWLAYS 1x1 ,你不能有一个像素的“分数”。 您可以通过抗锯齿等方式生成的“捏造”因素的数量也将取决于底层平台的图形/渲染工作流程。

但是,我同意 BitNinja 的观点,Graphics 2D Shapes API 是一种更适合在几乎所有情况下使用的 API,而不是原始 API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM