【问题标题】:Line/Paths intersecting相交的线/路径
【发布时间】:2014-07-31 21:07:57
【问题描述】:

我正在为基于矢量的绘图程序制作一个简单的橡皮擦工具。

我将路径保存在List 中为android.graphics.Path,然后使用canvas.drawPath(path, paint) 将它们循环绘制到画布上。在这个例子中,红线是橡皮擦,绿线应该被擦除。

我尝试将Paths 转换为Regions 并调用redRegion.op(greenRegion, Region.OP.INTERSECT)。我认为问题在于路径没有表面积,因为尚未应用油漆,它们只是简单的线条。

我正在为 API lvl 15 构建。

【问题讨论】:

    标签: android path vector-graphics


    【解决方案1】:

    如果您的背景始终为白色,您可以将“橡皮擦”设为白色路径。然后它会使其他行看起来被删除。

    编辑:

    也许您可以查询用于在触摸事件中绘制路径的所有点,并创建一个自定义类来封装它。然后有一个方法是这样的:

    //other code....
        MyCustomClass class = new MyCustomClass();
    
        if(class.contains(float x, float y)) {
          //...erase line
        } 
    //other code
    

    MyCustomClass

    public class MyCustomClass {
    
      private List<PathPoints> pathPoints;
    
      public MyCustomClass(List<PathPoints> points) {
       this.pathPoints = points;
      }
    
      public boolen contains(float x, float y) {
    
        for(PathPoint point: pathPoints) {
          if(x == point.getX() && y == point.getY()) {
            return true;
          } 
          return false; 
    
        }
      } 
    
    }
    

    和路径点类

    public class PathPoint {
    
      private float x;
      private float y;
      private int movementType;
    
      public void setX(float x) {
      this.x = x;
    } 
    
    //..all the other getters and setters. 
    
    }
    

    然后在您的 onTouch 事件中为每条绘制的路径添加一个新的 PathPoint 到路径点列表中。仅在 Action.UP 中创建新路径点(用户已停止绘制)。

    编辑 2:好的,这是另一个想法。为什么不创建自己的自定义路径类,然后将所有这些逻辑添加到该类中。因此,当您绘制路径时,您只需将路径点添加到路径。然后将方法“contains()”添加到您的自定义路径类。这样,它将包含路径上的每个点,无论是移动到、线到、四边形还是其他。所以是这样的:

    public class MyPath extends Path {
    
        private List<PathPoint> points;
    
        public MyPath(List<PathPoints> pathPoints) {
            this.points = pathPoints;
        }
    
        public void addPathPoint(PathPoint pathPoint) {
            if(points != null) {
                points.add(pathPoint);
            }
        }
    
        public boolean contains(float x, float y) {
            for(PathPoint pathPoint: points) {
                if(pathPoint.getX() == x && pathPoint.getY() == y) {
                    return true;
                }
            }
    
            return false;
        }
    }
    

    它的绘图部分应该仍然可以正常工作,因为您没有触摸它。让我知道这个是否奏效。

    【讨论】:

    • 该行应该被完全删除。
    • 所以如果一条线被触摸它应该完全消失?
    • 不。 PathPoint 只保存角点/控制点。在包含它只检查那些和所有点之间的不匹配。
    • 哦,是的,没错。你需要在每个事件中添加一个新的路径点,但是你需要以某种方式知道哪些路径点用于哪个路径......
    • 代码的问题是橡皮擦上的点永远不会完全等于用于绘制线条的控制点。一个简单的等号不会削减它,你必须计算距离,如果它小于橡皮擦宽度的一半加上它定义相交的线宽度的一半。我通过使用 PathMeasure 计算路径上的点来实现类似的解决方案。问题是它的性能非常糟糕,数百条路径需要几秒钟。
    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多