Java - 使用 Line2D 擦除
Java - Erasing with Line2D
我在 java 中创建了一个简单的绘图程序。我 运行 遇到了擦除工具的问题。我不能让用户只用白色油漆来擦除,因为我希望背景是图片。无论如何,每当用户使用油漆绘制时,我都试图解决这个问题,试图让它将 Line2D 添加到数组列表中。然后,我希望用户在程序上画一条白线以显示正在擦除的内容。当白线进入图形时,我想得到一个结果。这是我的代码:
al = new ArrayList<Line2D>();
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
if(graphics2D != null && paint.erase==false)
{
currentX = e.getX();
currentY = e.getY();
graphics2D.setStroke(new BasicStroke(size));
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
oldX = currentX;
oldY = currentY;
Line2D test=new Line2D.Float(oldX, oldY, currentX, currentY);
al.add(test);
//New system
}
if (paint.erase==true)
{
currentX = e.getX();
currentY = e.getY();
graphics2D.setStroke(new BasicStroke(size));
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
for( Line2D name : PadDraw.al ) {
boolean result = Line2D.linesIntersect(oldX,oldY,currentX,currentY,name.getX1(),name.getY1(),name.getX2(),name.getY2());
if (result==true)
{
System.out.println("paint found");
}
}
oldX = currentX;
oldY = currentY;
}
}
});
这里有一个可能有效的非常灵活的解决方案:
- 创建一个
graphics
完全透明且与图片大小相同
- 在上面画黑线用于擦除
- 遍历图形。对于每个黑色像素,将像素从图像复制到
graphics
的相同位置。
- 将该图形渲染到原始图形上
您还可以用它绘制擦除矩形、圆形等。但是,您不应该在每次鼠标移动时都使用它,因为这会花费太长时间。你可以在那些地方临时画点颜色来弥补。
我在 java 中创建了一个简单的绘图程序。我 运行 遇到了擦除工具的问题。我不能让用户只用白色油漆来擦除,因为我希望背景是图片。无论如何,每当用户使用油漆绘制时,我都试图解决这个问题,试图让它将 Line2D 添加到数组列表中。然后,我希望用户在程序上画一条白线以显示正在擦除的内容。当白线进入图形时,我想得到一个结果。这是我的代码:
al = new ArrayList<Line2D>();
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
if(graphics2D != null && paint.erase==false)
{
currentX = e.getX();
currentY = e.getY();
graphics2D.setStroke(new BasicStroke(size));
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
oldX = currentX;
oldY = currentY;
Line2D test=new Line2D.Float(oldX, oldY, currentX, currentY);
al.add(test);
//New system
}
if (paint.erase==true)
{
currentX = e.getX();
currentY = e.getY();
graphics2D.setStroke(new BasicStroke(size));
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
for( Line2D name : PadDraw.al ) {
boolean result = Line2D.linesIntersect(oldX,oldY,currentX,currentY,name.getX1(),name.getY1(),name.getX2(),name.getY2());
if (result==true)
{
System.out.println("paint found");
}
}
oldX = currentX;
oldY = currentY;
}
}
});
这里有一个可能有效的非常灵活的解决方案:
- 创建一个
graphics
完全透明且与图片大小相同 - 在上面画黑线用于擦除
- 遍历图形。对于每个黑色像素,将像素从图像复制到
graphics
的相同位置。 - 将该图形渲染到原始图形上
您还可以用它绘制擦除矩形、圆形等。但是,您不应该在每次鼠标移动时都使用它,因为这会花费太长时间。你可以在那些地方临时画点颜色来弥补。