【发布时间】:2014-02-07 10:06:14
【问题描述】:
我目前正在制作一个绘画应用程序,并且正在实施橡皮工具。由于我使用的画布(JPanel)具有透明背景(预期),我不能只调用 g2d.fillOval(x,y,x,y) 因为它会绘制一个透明的圆圈,因此绘图以前在那里会留下来。因此,我决定在两个循环中使用 WritableRaster 和 setPixel 方法来塑造像素绘制成圆形的整体“形状”(每个切线上的 r 都相同)。然而,我在调用 setPixel 方法时遇到了问题,因为它不绘制任何东西。我什至将颜色设置为黑色只是为了测试它,什么都没有。我一直在篡改它并插入打印语句并将其缩小到最内部的 for 块中,因为打印方法不会输出到控制台。
这是我的代码
WritableRaster raster = (WritableRaster) bi.getData();
Integer[] arrayw = al.get(i);
Point p1 = new Point(arrayw[0], arrayw[1]);
Point p2 = new Point(arrayw[2], arrayw[3]);
int[] black = new int[]{0, 0, 0};
int r = tl.get(i);
for (int y = p1.y - r; y < r; y++) {
int bound = (int) (Math.sqrt(r * r - y * y) + 0.5);
for (int x = p1.x - bound; x < bound; x++) {
raster.setPixel(x, y, black);
gc.drawLine(x, y, x, y);
System.out.println(y + "\t" + x + "\t" + tl.get(i));
}
}
for (int y = p2.y - r; y < r; y++) {
int bound = (int) (Math.sqrt(r * r - y * y) + 0.5);
System.out.print("test");
for (int x = p2.x - bound; x < bound; x++) {
raster.setPixel(x, y, black);
gc.drawLine(x, y, x, y);
System.out.println(y + "\t" + x + "\t" + tl.get(i));
}
}
System.out.print("raster");
bi.setData(raster);
正如我之前所说,代码会打印光栅,但不会在内部 for 块内打印。我不知道我做错了什么。感谢您的帮助!
【问题讨论】:
-
您是否验证过内部块的条件是否满足?例如,如果
x总是大于或等于p1.x - bound,那么x < bound是真的吗?如果p1.x > 2 * bound,你的内部循环将永远不会被调用。 -
@NathanielJones 谢谢,你是对的。我得到了它的工作。
标签: java for-loop graphics raster