7

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

同样,如果我触及这条曲线中的任何一条,这条曲线将细分为另外两条曲线,依此类推。

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

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

4

1 回答 1

1

您可以使用de Casteljau算法来做到这一点。如果你真的很喜欢它的数学,请查看这里的维基百科页面,但如果你不是那么喜欢数学,它可能会让你感到困惑,因为它实际上很简单......

  1. 沿触摸曲线(0.0 到 1.0 之间)计算参数化值。为此,您可以定期计算一组点(0.1、0.2、0.3 等),然后找到离您的接触点最近的两个点,如果您想要更高的精度(0.21、0.22、 0.23 等)。这将沿曲线段生成一个介于 0.0 和 1.0 之间的数字,表示您触摸的位置。
  2. 这一点很难用文字解释,但是在这个页面上有一个很好的可视化,大约在标题细分贝塞尔曲线下方的一半。使用图表下方的滑块查看它是如何工作的,这是我的文字说明:您需要根据您在步骤 1 中计算的参数化值按比例细分曲线段的控制点之间的直线。因此,如果您计算 0.4,您有四个点(A、B、C、D)加上曲线上最靠近您的触摸点的分割点,沿曲线为 0.4,我们将此分割点称为 S:
    • 沿线 B→C 计算一个临时点 T 为 0.4
    • 令 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

现在你有两条新的贝塞尔曲线,第一条使用控制点 A1、B1、C1、D1,第二条使用 A2、B2、C2、D2。

于 2012-04-03T16:26:49.430 回答