使用float / double值创建椭圆/矩形

时间:2013-03-28 19:33:40

标签: java graphics

我想用float或double值绘制一个数字,确切地说。

我用:

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

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

是否有任何使用float / double值的语句?

这是一张图片:Problem

圈子必须居中,我不能。任何解决方案?

代码:

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

如果您想要像CAD应用程序那样精确,请注意,由于显示器的限制,屏幕上显示的内容只是基础模型的近似值。

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

<强>更新

根据您的上次更新:

我们从JavaDoc了解到,fillOval(x, y, w, h)作为参数x, y,其中w, h是左上角坐标,g.fillOval(width+2*idx, height+2*idx, widthOval-5*idx, heightOval-5*idx); 是宽度和高度。

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

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

width

请注意,您在第一个和第二个参数中使用的height和{{1}}变量实际上与宽度和高度无关,而是提供与原点相对的起始偏移量。绘制椭圆形。

答案 2 :(得分:0)

您可以使用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函数,如here所述。