Path 如何在bezier路径上进行几何高级操作?

Path 如何在bezier路径上进行几何高级操作?,path,geometry,shapes,bezier,pathgeometry,Path,Geometry,Shapes,Bezier,Pathgeometry,我有一个使用中点近似绘制常规贝塞尔路径图形(由许多贝塞尔点组成的复杂路径)的库 我可以毫无问题地绘制它们,但我需要添加对高级几何操作的支持:曲线的最近点、交点、地物包含点,更重要的是,路径组合:差、交点、异或、并集 有什么好的来源可以得到这些吗 谢谢我不得不在曲线或闭合路径上实现这些操作。它主要归结为直线和多边形操作。一些有用的概念: 控制点围绕贝塞尔路径形成一个凸包,这对于短路相交相关操作非常有用 您的曲线细分应该是自适应的,在下一次细分没有显著差异时停止,这意味着每个“一半”可能会划分到不同

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

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

有什么好的来源可以得到这些吗


谢谢

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

  • 控制点围绕贝塞尔路径形成一个凸包,这对于短路相交相关操作非常有用
  • 您的曲线细分应该是自适应的,在下一次细分没有显著差异时停止,这意味着每个“一半”可能会划分到不同的深度
  • 可以在任意点(而不仅仅是中点)细分曲线,这对于创建以找到的兴趣点结束的贝塞尔子曲线非常有用
  • 任意细分的示例代码:

     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());
     }
    
    一些有用的网站:

    • (PDF)

    我意识到这已经过时了。它仍然相关吗?不同集合操作的结果是什么?如果取两条不共享点的路径的并集,是否只有两条路径存储在一个数据结构中?