2012-03-25 51 views
1

当渲染重叠的CGPath时,Apple使用缠绕规则来决定是否将它们都渲染为实体,或者使用其中一个切割另一个。我想让我的所有CGPath都是稳定的,但我不能告诉用户“用这种方式把它们画到或者其他地方”,所以我需要检测绕组方向是否与正常相反,然后将其反转。寻找CGPath的方向/缠绕方向

我知道如何使用CGPathApply来反转路径的所有元素(虽然它有很多样板代码) - 但是如何访问CGPath的卷绕方向?苹果公司是否已经计算过它(因为它们在内部使用它)?

最坏的情况,我也重新实现了车轮,并进行其他CGPathApply计算绕组 - 但似乎过于样板/容易出错,所以如果有一个苹果源出于此信息...

回答

0

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

无论如何,没有一个真正的根本“路径方向”的路径。填充规则总是在点评估绕线

想象一下一个八字形的路径,其中一个叶片顺时针旋转,另一个逆时针旋转。一个叶片内的一个点的绕组不同于另一个叶片的绕组。

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

+0

EO是我在问这个问题的相反,所以我不明白这会有什么帮助。 C.F. “我希望我所有的CGPath都是稳定的”。 – Adam 2012-03-29 12:52:35

+0

re:八位数字 - ouch。碰巧,由于应用程序的本质,绘制起来非常不方便,但我明白了你的观点。我可以在绘图阶段添加一些东西来防止自相交,尽管它可能只是作为用户方面的事故发生。 – Adam 2012-03-29 12:54:44

0

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

  1. 使用CGPathApplier运行自定义功能
  2. 每个节点转换为自定义对象(因为苹果的API是不OOP)
  3. 迭代所有节点,如果你发现一个CLOSE这是而不是最后一个节点,分割(你有多个子路径),然后重新启动每个子路径的算法,遍历所有节点,沿着每个线段中途选取一个点,然后向左步进1个像素,向右一个像素(其中“左/右”表示“垂直于线的方向”
  4. 询问Ap PLE“是内部路径(像素向左)?”
  5. 同上像素向右
  6. 如果所有都向左=绕组
  7. 如果都是向右=如果左混合/右绕组b
  8. =警告用户,他们的形状越过自己,一切都会变得奇怪和错误