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;
            }

        }
        });

这里有一个可能有效的非常灵活的解决方案:

  1. 创建一个graphics完全透明且与图片大小相同
  2. 在上面画黑线用于擦除
  3. 遍历图形。对于每个黑色像素,将像素从图像复制到 graphics 的相同位置。
  4. 将该图形渲染到原始图形上

您还可以用它绘制擦除矩形、圆形等。但是,您不应该在每次鼠标移动时都使用它,因为这会花费太长时间。你可以在那些地方临时画点颜色来弥补。