Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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 AWT绘制浮点矩形_Java_Canvas_Awt - Fatal编程技术网

Java AWT绘制浮点矩形

Java AWT绘制浮点矩形,java,canvas,awt,Java,Canvas,Awt,在AWT画布中,我想在坐标(0.5,0.5)处绘制一个矩形。不幸的是,fillRect()方法只接受整数。我被迫强制转换浮点变量以使其运行 True:因为画布坐标以像素为单位,所以0.5并不重要,因为不能有半个像素。然而,当我将所有内容缩放50倍时,我可以很容易地看出矩形不是我想要的位置 如果您打算回答“为什么首先要放大所有东西?”,我想将物理引擎坐标转换为画布坐标。例如:在大小为600x600的画布上,世界坐标(1,0)处的实体在画布坐标中应为(400300)。这并不重要,但我非常希望有一种制

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

True:因为画布坐标以像素为单位,所以0.5并不重要,因为不能有半个像素。然而,当我将所有内容缩放50倍时,我可以很容易地看出矩形不是我想要的位置

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

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

您正在寻找一个新的解决方案。这样你就可以在十进制坐标下画图了

Rectangle2D.Double rect = new Rectangle2D.Double(.5, .5, 4, 6);
在坐标(.5,5)和尺寸(4,6)处创建矩形。你应该用铅笔画这个。下面介绍如何将
图形g
转换为
图形2D
对象,然后绘制矩形:

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();
        }

    }
}
这就产生了

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

苏欧,我的意思是。像素是AWLAYS
1x1
,不能有像素的“分数”。您可以通过消除混叠等方式生成的“伪造”因素的数量也将取决于底层平台图形/渲染工作流


然而,我同意BitNinja的观点,图形2D形状API是一种更适合在除原始API之外的几乎所有情况下使用的API。

像素没有分数,这根本不可能。
Shape
API支持带来了分数参数,它是为高分辨率打印目的而设计的。虽然技术上正确,但你不能拥有一个像素的分数……只是说;)当然不是,但它可能是假的。效果很好,对我来说,集中在屏幕上足够准确!我注意到您正在执行
Graphics2D g2d=(Graphics2D)g.create()我看到过其他代码,它们确实
Graphics2D g2d=(Graphics2D)g
你知道这两者之间有什么重要的区别吗?@MadProgrammer是的,你可以,这是一直在做的,叫做抗锯齿。