我使用nanovg库来渲染复合贝塞尔曲线形状,但nanosvg库并没有告诉我卷绕方向,也就是固体/孔洞的强度复合形状中的每个子路径。
假设所有路径都是非交叉的,假设所有路径都是非交叉的,那么什么是数学算法会告诉我哪个子路径是实心的,哪个是一个洞?
我可以计算每个子路径的面积,按区域排序,以及实体和孔之间的替代,但这仅在路径形成子集链时才有效,因此无法绘制此复合形状。
答案 0 :(得分:1)
该算法是SVG fill-rule定义中描述的算法。从一个点开始并将一条任意光线绘制到无穷大(嗯,一条线在你需要考虑的区域之外结束)并使用两种方法之一非零和 evenodd计算路径交叉点描述。
确定交叉计数:不要一次尝试为子路径执行此操作,而是单独考虑每个路径段。大多数人的计数为零,这很好。 This library例如function用于计算三次贝塞尔曲线与直线之间的交点。查看源代码,它有详细记录。 (虽然作者对版权采取的立场并不十分清楚。)
确定路径方向:您只需确定线段的起点和终点是光线的左侧还是右侧。
最后,对于非零,如果最终计数总数不为零,则内部有一个点。对于 evenodd ,如果最终计数总数为奇数,则在内部。