如何细分UIBezierPath并将其存储在两个不同的对象中

时间:2011-12-19 06:35:56

标签: iphone uibezierpath

我在应用程序中有UIBezierPath。当识别出路径上的手指触摸时,我想细分该曲线并将两条曲线存储到两个不同的对象中。因此,触摸坐标将作为一条曲线的终点和第二条曲线的起点。

如果我触摸任何一条曲线,该曲线将再次细分为另外两条曲线,依此类推。

我搜索了很多。但找不到任何好的解决方案。

此外,我不知道是否有其他方法可以做到这一点。任何帮助将不胜感激。 感谢

1 个答案:

答案 0 :(得分:1)

您可以使用 de Casteljau 算法执行此操作。如果你真的喜欢它的数学check out the Wikipedia page here,但是如果你不是那么数学,它可能会让你比任何事情都困惑,因为它实际上非常简单......

  1. 计算触摸曲线(介于0.0和1.0之间)的参数化值。为此,您可以定期计算一组点(0.1,0.2,0.3等),然后找到距触点最近的两个点,并在需要更高精度时重复这些点之间的参数化(0.21,0.22, 0.23等)。这将导致曲线段上的数字介于0.0和1.0之间,表示您触摸的位置。
  2. 这一点很难在文字中解释,但在细分Bezier曲线标题下,this page上有一个很好的可视化效果。使用图表下方的滑块查看它是如何工作的,这是我的文字说明:您需要细分曲线段控制点之间的直线,与您在步骤1中计算的参数化值成比例。因此,如果计算为0.4,则为有四个点(A,B,C,D)加上曲线上最接近你的触点的曲线上的分裂点,我们称之为分裂点S:
    • 计算沿B→C
    • 线的0.4的临时点T.
    • 设点A1等于点A
    • 沿着线A→B
    • 计算点B1为0.4
    • 沿着线B1→T
    • 计算点C1为0.4
    • 设点D1等于分裂点S
    • 设点D2等于点D
    • 沿着线C→D
    • 计算点C2为0.4
    • 沿着线T→C2
    • 计算点B2为0.4
    • 设点A2等于分裂点S
  3. 现在你有两条新的Bezier曲线,第一条使用控制点A1,B1,C1,D1,第二条使用A2,B2,C2,D2。