在我的AWT画布中,我想在坐标(0.5,0.5)处绘制一个矩形。不幸的是,fillRect()
方法只接受整数。我被迫投射我的浮点变量以使其完全运行。
True:因为画布坐标以像素为单位,所以0.5并不重要,因为你不能有一半的像素。但是,当我将所有内容缩放50时,我可以轻松地告诉矩形不是我想要的地方。
如果您打算回答"为什么要首先扩展所有内容?",我想将物理引擎坐标转换为画布坐标。例如:世界坐标中的实体at(1,0)在尺寸为600x600的画布上的画布坐标中应为(400,300)。这不是CRUCIAL,但我非常欣赏制作浮点矩形的方法。或者更好的转换坐标的方法。
提前致谢!
答案 0 :(得分:3)
您正在寻找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);
答案 1 :(得分:1)
我的评论被“批评”了“像素没有分数,这根本不可能。”不“准确”
那么,让我们关注一个简单的例子...
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”组件延伸到它的 10x10
之外,大小为 1 像素,在它的右侧和底部。
Sooo,我的意思是。一个像素是 AWLAYS 1x1
,你不能有一个像素的“分数”。您可以通过抗锯齿等方式生成的“捏造”因素的数量也将取决于底层平台的图形/渲染工作流程。
不过,我同意 BitNinja 的观点,Graphics 2D Shapes API 是一种更适合用于除原始 API 之外的几乎所有情况的 API。