查找 CGPath 的方向/缠绕方向

Posted

技术标签:

【中文标题】查找 CGPath 的方向/缠绕方向【英文标题】:Finding the direction / winding direction of a CGPath 【发布时间】:2012-03-25 22:26:28 【问题描述】:

在渲染重叠的 CGPath 时,Apple 使用缠绕规则来决定是将它们都渲染成实体,还是使用其中一个来切掉另一个。

我希望我所有的 CGPath 都是实心的,但我不能告诉用户“以这种方式绘制它们或 ELSE”,所以我需要检测缠绕方向何时与正常方向相反,然后将其反转。

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

在最坏的情况下,我还将重新实现***,并制作另一个 CGPathApply 来计算缠绕 - 但这似乎过于样板/容易出错,所以如果有 Apple 来源提供此信息...

【问题讨论】:

【参考方案1】:

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

无论如何,路径并没有真正的基本“蜿蜒方向”。填充规则总是评估在某个点处的缠绕。

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

我认为如果你想强制你的对象是“实心的”,你必须对用户输入的路径进行一些手术。同样,提供一致的结果并让用户自己弄清楚如何做可能会更容易。

【讨论】:

EO 与我在问题中要求的相反,所以我看不出这有什么帮助。参考文献“我希望我所有的 CGPath 都是可靠的”。 re:八字形 - 哎哟。碰巧的是,由于应用程序的性质,这不太可能被绘制,但我明白你的意思。我可以在绘图阶段添加一些东西来防止自相交,尽管它可能只是作为用户方面的意外发生。【参考方案2】:

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

    使用 CGPathApplier 运行自定义函数 将每个节点转换为自定义对象(因为 Apple 的 API 是非 OOP) 遍历所有节点,如果找到不是最终节点的 CLOSE,则拆分(您有多个子路径),然后使用每个子路径重新启动算法 遍历所有节点,在每个线段的中间选择一个点,然后向左步进 1 个像素,向右步进 1 个像素(其中“左/右”表示“垂直于线的方向” 问苹果“是否(像素到左边)在路径内?” 右移像素 如果全部向左 = 绕道 如果都向右 = 缠绕 b 如果左/右混合 = 提醒用户他们的形状交叉,一切都会变得奇怪和错误

【讨论】:

以上是关于查找 CGPath 的方向/缠绕方向的主要内容,如果未能解决你的问题,请参考以下文章

查找设备是不是指向正确的航向/方向?

斜方向三消查找算法的原理和实现

快速查找 iPhone 的指南针方向

在 Android 上查找指南针方向

在android中查找设备的相对方向

通过向量扩展二维多边形