path - 如何在贝塞尔路径上进行几何高级操作?

标签 path geometry shapes bezier pathgeometry

我有一个使用中点近似绘制常规贝塞尔路径图(由许多贝塞尔点形成的复杂路径)的库。

我可以毫无问题地绘制它们,但我需要添加对高级几何操作的支持:曲线的最近点、交点、图形包含点,更重要的是,路径组合:差、交、异或、联合 , ...

有什么好的来源可以得到这一切吗?

谢谢

最佳答案

我不得不在曲线或闭合路径上实现其中的一些操作。它主要归结为线和多边形操作。几个有用的概念:

  • 控制点在 Bezier 路径周围形成一个凸包,这对于与交叉路口相关的短路操作很有用。
  • 您的曲线分割应该是自适应的,在下一个分割不会有显着差异时停止,这意味着每个“一半”可能会划分到不同的深度。
  • 您可以在任何点分割曲线,而不仅仅是中点,这对于创建以找到的兴趣点结束的 Bezier 子曲线很有用。

  • 任意分割的示例代码:
     static Point2D.Double[][] splitBezier(Point2D.Double[] p) {
         return splitBezier(p, 0.5);
     }
    
     static Point2D.Double[][] splitBezier(Point2D.Double[] p, double t) {
        Point2D.Double[][] parts = new Point2D.Double[2][4];
        Point2D.Double ab = interpolate(t, p[0], p[1]);
        Point2D.Double bc = interpolate(t, p[1], p[2]);
        Point2D.Double cd = interpolate(t, p[2], p[3]);
        Point2D.Double abc = interpolate(t, ab, bc);
        Point2D.Double bcd = interpolate(t, bc, cd);
        Point2D.Double abcd = interpolate(t, abc, bcd);
        parts[0][0] = p[0];
        parts[0][1] = ab;
        parts[0][2] = abc;
        parts[0][3] = abcd;
        parts[1][0] = abcd;
        parts[1][2] = bcd;
        parts[1][2] = cd;
        parts[1][3] = p[3];
        return parts;
     }
    
     static Point2D.Double interpolate(double t, Point2D.Double a, Point2D.Double b) {
        return new Point2D.Double((1 - t) * a.getX() + t * b.getX(),
                                  (1 - t) * a.getY() + t * b.getY());
     }
    

    一些有用的网站:
  • Details with applets
  • Discussion of more advanced intersection methods (PDF)
  • 关于path - 如何在贝塞尔路径上进行几何高级操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482898/

    相关文章:

    java - 无缓冲图像的 Alpha 混合

    Angular 图像路径

    java - 无法在 java 路径中找到属性文件

    algorithm - 并行算法 : Checking if a pixel is covered by one of the shapes

    flutter - 自定义形状问题波动

    形状=圆形的节点的大小

    c++ - 当目标路径文件以点 ('.' 开头时,来自 boost::log 的未处理异常)

    Java nio : How to add extension to an absolute path?

    algorithm - 如何检查一个点是否位于另外两个点之间的一条线上

    php - 如何使用 PHP 从 MySQL 数据库中读取几何数据类型