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

7
我在应用程序中使用了UIBezierPath。当手指触摸到路径时,我希望能够将该曲线细分并将这两条曲线存储到两个不同的对象中。所以触摸坐标将作为第一条曲线的终点和第二条曲线的起点。
如果再次触摸任何一条曲线,则该曲线将被细分为另外两条曲线,以此类推。
我搜索了很多,但没有找到任何好的解决方案。
同时,我不知道是否有其他方法可以做到这一点。非常感谢您的帮助。谢谢。

我找到了一个链接。看看这个,伙计们。我认为它可能会帮助我将贝塞尔曲线细分。http://www.genie-meca.ac-aix-marseille.fr/Productique/PDF/361_deCasteljau_john.pdf - Harsh
2
这可能有用,也可能没有,但它向您展示了如何将UIBezierPath分解为其各个路径:https://dev59.com/F3A75IYBdhLWcg3w4tV7 - titaniumdecoy
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. 这部分很难用文字解释,但是在this page的中间部分下面有一个很好的可视化效果,标题为“细分贝塞尔曲线”。使用图表下面的滑块查看其工作原理,这是我的文字说明:您需要按比例细分曲线段控制点之间的直线,这个比例是您在步骤1中计算出的参数化值。因此,如果您计算出0.4,则有四个点(A、B、C、D)加上曲线上最接近0.4的分割点,我们将称其为点S:
    • 计算临时点T,它沿着B→C线0.4
    • 让点A1等于点A
    • 计算点B1,它沿着A→B线0.4
    • 计算点C1,它沿着B1→T线0.4
    • 让点D1等于分割点S
    • 让点D2等于点D
    • 计算点C2,它沿着C→D线0.4
    • 计算点B2,它沿着T→C2线0.4
    • 让点A2等于分割点S

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接