【发布时间】:2017-09-19 21:44:14
【问题描述】:
我正在使用nanovg 库来渲染复合贝塞尔形状,但nanosvg 库并没有告诉我缠绕方向,也就是复合形状中每个子路径的坚固性/孔度。
假设所有路径都不相交,在给定子路径的 Bezier 点的情况下,有什么数学算法可以告诉我哪个子路径是实心的,哪个是洞?
我可以计算每个子路径的面积,按面积排序,并在实体和孔之间进行选择,但这仅在路径形成子集链时才有效,因此无法绘制这种复合形状。
【问题讨论】:
-
技术说明:“贝塞尔多边形”不存在。多边形是由直线部分组成的路径,而贝塞尔曲线是曲线。这可能是吹毛求疵,但您要问的是技术主题,因此正确使用术语会带来很大的不同。至于“有算法吗?”答案取决于您的图书馆。一些库将顺时针/逆时针视为填充/剪切,一些库坚持“相反方向意味着相反的填充规则”。但是,没有算法可以告诉您必须完全基于路径填充/剪切什么,因为这不是路径的属性。
-
@Mike'Pomax'Kamermans 不错的收获,谢谢。还添加了所有路径不相交的假设,所以我相信现在应该明确定义。 nanovg 恰好将 CCW 视为填充,CW 视为切口。
-
你能指定svg填充规则吗?如果是这样,请将其设置为偶数/奇数,这样就可以解决问题,而无需您做任何工作。如果没有,请在 nanosvg 生成文件之后使用辅助实用程序(甚至是字符串替换)进行设置。
-
为什么不将 SVG 添加为代码,这样我们才能看到你真正得到了什么(遗憾的是 SO/SE 不支持 SVG 和 PCX 图像)。