【问题标题】:how to draw curve with four points如何用四个点绘制曲线
【发布时间】:2013-12-06 06:27:03
【问题描述】:

我可以使用贝塞尔路径绘制曲线,但我不想指定两个控制点,而是指定路径经过它的两个点,如下所示

起点为(10,90),终点为(70,70),曲线经过(20, 50),即为峰值点。和 (60,100)。请告诉我如何绘制它。

【问题讨论】:

标签: ios ios6 ios7 bezier


【解决方案1】:

来自维基百科的“贝塞尔曲线”文章:

任何 4 个不同点的任何系列都可以转换为按顺序通过所有 4 个点的三次贝塞尔曲线。给定某三次贝塞尔曲线的起点和终点,以及沿该曲线依次排列的任意两个不同点,即可恢复原始贝塞尔曲线的控制点。[3]

最后链接到http://people.sc.fsu.edu/~jburkardt/html/bezier_interpolation.html

【讨论】:

    【解决方案2】:

    你可以使用UIBezierPathaddCurveToPoint:controlPoint1:controlPoint2:方法。

    CGPoint startPt, endPt, cPt1, cPt2;
    // init points here
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:startPt];
    [path addCurveToPoint:endPt controlPoint1:cPt1 controlPoint2:cPt2];
    

    【讨论】:

      【解决方案3】:

      假设我们有四个点D0(x0,y0)D1(x1,y1)D2(x2,y2)D2(x3,y3)。我们必须找到通过D0D1D2D3 的贝塞尔三次样条P0-P1-P2-P3

      显然,

      P0 = D0
      P3 = D2
      

      那么通过方程定义的点D1和点D2有无数条贝塞尔样条

      P2 = (D1 - (1-t1)^3 * P0 - t1^3 * P3) / (3*(1-t1)*t1^2) -
           (1-t1) * P1/t1;
      P2 = (D2 - (1-t2)^3 * P0 - t2^3 * P3) / (3*(1-t2)*t2^2) -
           (1-t2) * P1/t2;
      

      其中t1是点D1对应的贝塞尔曲线参数,t2D2对应的参数。

      解决这个方程组将给我们P1

      P1 = t2*(D1 - (1-t1)^3 * P0 - t1^3 * P3) / (3*(1-t1)*t1*(t2-t1)) -
           t1*(D2 - (1-t2)^3 * P0 - t2^3 * P3) / (3*(1-t2)*t2*(t2-t1));
      

      我们仍然需要定义t1t2。只要它们不等于且不等于1,它们的值几乎可以是任何值。一个明显的选择是0.250.75

      这是一组随机输入值的结果曲线

      那么P1P2就可以作为controlPoint1和controlPoint2在 UIBezierPath 的addCurveToPoint:controlPoint1:controlPoint2 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        相关资源
        最近更新 更多