用点填充形状

时间:2014-04-08 08:57:26

标签: 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; // 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());
}

结果如下:

enter image description here

如您所见,半径越大,叶子就不会完全填满。 如果我更改i to 1350,则将其除以10,我计算x, y,然后填充,但速度要慢得多。有没有更好的方法来正确填充我的形状? 后来我也想用渐变填充我的形状,所以从绿色到深绿色,然后再回到绿色。用我的方法这很容易,但速度很慢。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我认为对你而言,最好的解决方案是使用泛洪填充算法,它很容易用Java实现,并且在你的情况下很有效,就像你有一个简单的形状。

这是一篇真正完整的维基百科文章:http://en.wikipedia.org/wiki/Flood_fill

答案 1 :(得分:0)

这是一个简单的建议:只需将创建轮廓的点放入数组中,而不是绘制叶子。该数组应该从xMin(叶子轮廓的最小X坐标)到xMax。每个元素都是两个整数:yMinyMax

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

如果数组中有间隙,请通过在相邻点之间插值来填充它们。

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