2

准确地说,我想使用浮点或双精度值绘制图形。

我用:

g.drawOval(0, 0, 10, 10);

画一个圆圈,但我只能使用整数值。

是否有任何使用浮点/双精度值的语句做同样的事情?

这是一张图片:问题

圆圈必须居中,而我不能。有什么解决办法吗?

代码:

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;

public class Bulls_EYE extends JPanel
{
    int red, green, blue;
    int height, width;
    int heightOval = 475, widthOval = 475;
    Random rValue = new Random();

    public void paint (Graphics g)
    {           
        super.paint(g);

        for (int idx = 0; idx < 100; idx++)
        {
        g.setColor(new Color(red = 1 + rValue.nextInt(255), green = 1 + rValue.nextInt(255), blue = 1 + rValue.nextInt(255)));
        g.fillOval(width+2*idx, height+2*idx, widthOval-5*idx, heightOval-5*idx);
        }
    }
}
4

3 回答 3

1

您没有理由这样做,因为在使用给定坐标绘制椭圆时,它们被称为屏幕上的像素。由于您无法在像素之间进行绘制,因此 1 是您可以使用的最小单位。如果要在绘制之前对值进行四舍五入,可以使用

g.drawOval(Math.round(a),Math.round(b),Math.round(x),Math.round(y)

float这将在绘制椭圆之前将 a、b、x 和 y舍入。我能看到的唯一原因是你计算了坐标,结果是 a float,那么你需要像上面那样舍入它。

于 2013-03-28T19:38:56.163 回答
1

我认为这是一个有趣的问题,但需要更多的上下文。绘图图元通常以像素坐标表示,因此像素的一部分没有多大意义。

如果您想要 CAD 应用程序那样的精度,请注意,由于显示的限制,屏幕上显示的只是底层模型的近似值。

您可以在内存中精确地表示您的模型(浮点表示有限制)并在屏幕上绘制近似值。

更新

根据您的上次更新:

我们从以左上角坐标fillOval为参数(x, y, w, h)的JavaDoc 中得知,以及宽度和高度。x, yw, h

如果对于每个同心圆,您将左上角坐标向内移动,在本例中为 2 px,以保持它们居中,您还必须将宽度和高度减少两倍。更改以下行:

g.fillOval(width+2*idx, height+2*idx, widthOval-5*idx, heightOval-5*idx);

int dx, dy, dw, dh;
dx = 2*idx;
dy = 2*idx;
dw = 2*dx; // note this is 4*idx not 5*idx like you have currently
dh = 2*dy;
g.fillOval(width+dx, height+dy, widthOval-dw, heightOval-dh);

请注意,在第一个和第二个参数中使用的变量widthheight变量实际上与宽度和高度没有任何关系,而是提供了从绘制椭圆的原点开始的偏移量。

于 2013-03-28T19:39:38.293 回答
1

您可以使用Arc2D类绘制具有浮点/双精度的圆,因为它是一个Shape并且Graphics2D类可以绘制形状。

@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    Shape circle = new Arc2D.Double(
            // Same values as used in the fillOval function,
            // but with double precision.
            x, y, width, height,
            // Draw a full circle (yes, in degrees).
            0, 360,
            // Connect the endpoint with the startpoint.
            Arc2D.CORD
    );
    // Paint the circle.
    g2d.fill(circle);
}

以类似的方式,您可以使用Rectangle2D类绘制矩形。

另外,请使用paintComponent函数而不是paint函数,如此所述。

于 2020-01-01T12:53:34.703 回答