【问题标题】:Fill a shape with points用点填充形状
【发布时间】:2014-04-08 08:57:25
【问题描述】:

我尝试在屏幕上绘制一个看起来像叶子的东西,并尝试用颜色填充它。这就像画一个圆,不同的是,它只有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 to 1350,然后将其除以10,我计算x, y,然后它会被填充,但速度要慢得多。有没有更好的方法来正确填充我的形状? 后来我还想用渐变填充我的形状,从绿色到深绿色,然后再变回绿色。使用我的方法,这很容易,但速度非常慢。

提前致谢!

【问题讨论】:

  • 只是为了确定:我假设您不允许通过调用 canvas.getGraphics() 并使用 @ 提供的所有基础设施来完成这项任务987654327@类...?
  • 没有限制,我只是尝试一下,因为我以前从未使用过 Java 图形。唯一的问题是,我想使用 setRGB 方法,而不仅仅是绘制线条和圆弧。
  • 如果使用setRGB 的原因是您希望您的绘画包含在BufferedImage 中,那么值得一提的是,您可以绘制线条和弧形以及填充形状进入图像,但也许你已经知道了,还有其他不这样做的原因。
  • 是的,我知道。一开始我只想为窗口的每个像素画上不同的颜色,后来我决定画圆和其他一些涉及到数学的东西,现在这个填充形状。
  • 对不起,但我仍然认为意图不明确。目前,您只是根据一些恰好看起来像一片叶子的规则设置点。洪水填充对您没有帮助,因为您没有封闭的边界。如果您想填充任意形状(使用手动 setRGB 调用),那么通常的方法是扫描线算法(cs.uic.edu/~jbell/CourseNotes/ComputerGraphics/…),但这实际上并不容易实现 - 特别是当您没有 representation i> 要填充的多边形的边界。

标签: java shape fill


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我会调查的!
【解决方案2】:

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

渲染完所有的点后,你可以只画垂直线来填充yMin/yMax之间的空间对于每个X坐标。

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

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

【讨论】:

  • 我想我会尝试使用数组。这听起来很简单,而且看起来比我的解决方案快得多。
  • 祝你好运;请注意,这听起来比看起来容易。作为开始,我建议从xMin = 0xMax = width of screen 开始,让您的生活更轻松。然后您可以稍后优化算法。
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2016-09-16
相关资源
最近更新 更多