Java 用点填充形状

Java 用点填充形状,java,shape,fill,Java,Shape,Fill,我试着在屏幕上画一个叶子状的东西,并尝试用颜色填充它。这就像画一个圆,不同的是,它只有270度,半径从0到100。我先画左边,然后在每一度上填充里面。最后我画右边。 下面是代码,也许更容易理解: canvas = new BufferedImage(SIZE, SIZE, BufferedImage.TYPE_INT_ARGB); Color black = new Color(0,0,0); Color green = new Color(0,130,0); double j = 0.0; /

我试着在屏幕上画一个叶子状的东西,并尝试用颜色填充它。这就像画一个圆,不同的是,它只有270度,半径从0到100。我先画左边,然后在每一度上填充里面。最后我画右边。 下面是代码,也许更容易理解:

canvas = new BufferedImage(SIZE, SIZE, BufferedImage.TYPE_INT_ARGB);
Color black = new Color(0,0,0);
Color green = new Color(0,130,0);
double j = 0.0; // radius
double max = 100.0; // max radius

for (int i = 0; i < 135; i++) { // left side (270 degree / 2)
    j += max / 135.0; 

    // x, y coordinate
    int x = (int)(Math.cos(Math.toRadians(i)) * j);
    int y = (int)(Math.sin(Math.toRadians(i)) * j);

    // draw a circle like thing with radius j
    for (int l = i; l < 135 + (135 - i); l++) {
        int ix = (int)(Math.cos(Math.toRadians(l)) * j);
        int iy = (int)(Math.sin(Math.toRadians(l)) * j);

        canvas.setRGB(ix + 256, iy + 256, green.getRGB());
    }

    canvas.setRGB(x + 256, y + 256, black.getRGB());
}

// draw the right side
for (int i = 135; i < 270; i++) {
    j -= max / 135.0;

    int x = (int)(Math.cos(Math.toRadians(i)) * j);
    int y = (int)(Math.sin(Math.toRadians(i)) * j);

    canvas.setRGB(x + 256, y + 256, black.getRGB());
}
结果是:

正如你所看到的,半径越大,叶子没有被完全填满。 如果我把I改为1350,然后除以10,在这里我计算x,y,然后它被填满了,但速度要慢得多。有没有更好的方法来正确填充我的形状? 后来我还想用渐变填充我的形状,从绿色到深绿色,然后再回到绿色。用我的方法,这很容易,但速度非常慢


提前谢谢

我认为对您来说,最好的解决方案是使用泛洪填充算法,它很容易用Java实现,在您的情况下也很有效,就像您有一个简单的形状一样


这是一篇非常完整的维基百科文章:

这里有一个简单的建议:不要绘制叶子,只需将创建轮廓的点放入数组中即可。数组应该从叶轮廓的最小X坐标xMin运行到xMax。每个元素是两个整数:yMin和yMax

渲染完所有点后,只需绘制垂直线即可填充每个X坐标的yMin/yMax之间的空间

如果阵列中存在间隙,请通过在相邻点之间插值来填充间隙


另一种方法是顺时针或逆时针对点进行排序,并将它们用作多边形的轮廓。

谢谢,我会研究它的!请确定:我假设您不允许通过调用canvas.getGraphics并使用Graphics类提供的所有基础结构来简化此任务…?没有限制,我只是尝试一下,因为我以前从未使用过Java Graphics。唯一的问题是,我想使用setRGB方法,而不仅仅是绘制直线和圆弧。当使用setRGB的原因是您希望您的绘画包含在BuffereImage中时,可能值得一提的是,您可以在图像中绘制直线、圆弧和填充形状,但您可能已经知道,不这样做还有其他原因。是的,我知道。首先,我只想用每个像素的不同颜色来绘制窗口,后来我决定用一些数学知识来画圆圈和其他东西,现在这就填充了这个形状。对不起,但我仍然认为意图不清楚。目前,您只是根据一些规则设置点,这些规则碰巧看起来像一片叶子。洪水泛滥对你没有帮助,因为你没有封闭的边界。如果您想用手动setRGB调用填充任意形状,那么通常的方法是扫描线算法,但这其实并不容易实现——特别是当您没有要填充的多边形的边界表示时。我想我会在数组中尝试。这听起来很简单,看起来比我的解决方案快得多;注意,听起来比看起来容易。作为一个开始,我建议从xMin=0和xMax=屏幕宽度开始,以使您的生活更轻松。然后,您可以稍后优化算法。