【发布时间】: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> 要填充的多边形的边界。