找到CGPath的方向/缠绕方向

时间:2012-03-25 22:26:29

标签: ios objective-c quartz-graphics

当渲染重叠的CGPath时,Apple使用缠绕规则来决定是否将它们都渲染为实心,或者使用其中一个来裁剪另一个。

我希望我的所有CGPath都是可靠的,但我不能告诉用户“以OR ELSE方式绘制它们”,所以我需要检测卷绕方向与正常方向相反,然后反转它。 / p>

我知道如何使用CGPathApply反转路径的所有元素(虽然它是很多样板代码) - 但是如何访问CGPath的缠绕方向? Apple没有计算过这个(因为他们在内部使用它)?

最糟糕的情况是,我还会重新实现这个轮子,并制作另一个CGPathApply计算绕组 - 但这似乎过于样板/错误,所以如果有这个信息的Apple源...

2 个答案:

答案 0 :(得分:0)

为什么不使用even-odd fill rule呢?然后每个子路径的方向不会影响结果。用户至少会看到一致的奇怪结果,并且能够发现不这样做。

无论如何,路径上并没有真正的“蜿蜒方向”。填充规则始终在点评估绕组

想象一下八字形路径,其中一个叶片顺时针方向,另一个逆时针方向。一个凸角内的一个点的绕组与另一个凸角内的绕组不同。

我认为如果你想强迫你的对象“坚固”,你将不得不对用户输入的路径进行一些手术。同样,可能更容易给出一致的结果,并让用户自己弄清楚如何做到这一点。

答案 1 :(得分:0)

最后,我写了自己的。伪代码:

  1. 使用CGPathApplier运行自定义函数
  2. 将每个节点转换为自定义对象(因为Apple的API是非OOP)
  3. 遍历所有节点,如果找到不是最终节点的CLOSE,则拆分(您有多个子路径),并使用每个子路径重新启动算法
  4. 遍历所有节点,沿每个线段中间选取一个点,然后向左步骤1个像素,向右一个像素(其中“左/右”表示“垂直于线的方向”
  5. 问Apple“路径内是(像素到左边)?”
  6. ditto pixel to right
  7. 如果所有人都离开=缠绕一个
  8. 如果一切顺利=缠绕b
  9. 如果左/右混合=警告用户他们的形状自己过去,一切都会变得奇怪和错误