PyX中闭合曲线填充失败:两种圆弧定义为何效果不同?
问题分析与解决方案
你遇到的问题核心在于PyX填充时的非零环绕数规则与路径变换后的方向组合冲突,导致第二种方式的路径被判定为没有需要填充的内部区域。
为什么第一种有效,第二种无效?
PyX默认用非零环绕数规则判断填充区域:路径的环绕方向(顺时针/逆时针)会影响环绕数的增减,只有环绕数不为0的区域才会被填充。
- 第一种方式:直接创建
path.arc(0,3,1,180,0),这个圆弧的逆时针方向与后续的right(向下直线)、downArc(顺时针圆弧)、反转后的left路径段组合后,整个闭合路径的环绕数为1,填充算法正确识别为内部区域。 - 第二种方式:先创建底部圆弧再平移,虽然形状看起来和第一种完全一致,但PyX内部对变换后路径元素的方向处理,导致整个路径的环绕方向组合最终使环绕数变为0——填充算法认为没有需要填充的区域,因此出现空心结果。
解决办法
你可以通过以下几种方式解决这个问题:
方法1:切换为奇偶填充规则
强制PyX使用奇偶规则(even-odd rule),这种规则只关心路径包围区域的次数,不管环绕方向,只要被路径包围奇数次就会填充。修改左侧画布的填充代码:
cL.fill(p, [color.rgb.blue, deco.fillevenodd])
方法2:统一路径环绕方向
调整变换后圆弧的方向,让整个闭合路径的环绕数不为0。比如反转upArc的方向:
upArc = path.path(path.arc(0,0,1,180,0)).transformed(trafo.translate(0,3)).reversed()
方法3:沿用直接创建路径的方式
最稳妥的还是保留第一种有效的写法,直接在目标位置创建圆弧,避免对单独路径段使用平移变换后再拼接。
验证效果
使用上述任意一种方法修改后,左侧图形都会被正确填充,和右侧效果一致。
内容的提问来源于stack exchange,提问作者Rami Luisto
相关产品推荐
相关产品推荐

