如何同等细分一个封闭的CGPath?

时间:2012-12-21 02:33:03

标签: uikit core-animation core-graphics polygon cgpath

我有一个不确定数量的各种形状和大小的封闭CGPath元素都包含一个凹的贝塞尔曲线,如下图中的红色和蓝色形状。

将这些形状划分为(大致)相同大小的n区域的最简单,最有效的方法是什么?

Current CAShapeLayers

2 个答案:

答案 0 :(得分:2)

你想要的是Delaunay triangulationHere is an example类似于你想要做的事情。它使用as3 library。这是一个iOS端口,可以帮助您:

https://github.com/czgarrett/delaunay-ios

答案 1 :(得分:1)

我并不真正了解您想要实现的内容以及约束条件。例如,是否有严格要求细分区域大小相等?

性能问题的解决方案通常不是更快的算法,而是一种不同的方法,通常是以下一种或多种方法:

  1. 预先计算值,或尽可能离线计算。比如使用另一个能够离线细分并缓存多个客户端结果的服务器API。您可以将后计算结果作为位图提供,其中每种颜色都会索引到要显示的值表中。查找该值将是在触摸位置处索引像素的简单问题。

  2. 简化或近似解决方案。网格细分是否足够准确?在500 x 6 = 3000细分时,每个区域只有大约51个平方点,这是一个大约7x7点的区域。在该尺寸下,用户不会注意到该区域是否完全准确。由于触摸分辨率的原因,您可能需要最终聚合相邻区域。

  3. 渐进式细化。您通常不需要预先计算整个算法。算法通常以离散(通常是对称的)单位运行,这意味着您经常重复使用先前步骤中的信息。您可以预先计算第一步,然后使用后台线程逐步填充其余细节。您也可以推迟最终计算,直到触摸发生。此时仍可以容忍延迟一秒钟,或者在最坏的情况下,您可以在计算过程中显示动画。

  4. 你可以使用一些混合方法,并可能使用Delaunay三角测量计算一个或两个级别,然后使用一个简单的快速三角形细分另外两个级别。

    根据所需的精度,如果不需要谨慎的样本,可以使用三角形点之间的加权平均值来近似最终水平,即,如果触摸位于两点之间,请选择两者之间的平均值。它们。