Class Bezier

Bézier曲线

See

https://en.wikipedia.org/wiki/B%C3%A9zier_curve

Author

feng / http://feng3d.com 03/06/2018

Hierarchy

  • Bezier

Constructors

Methods

  • n次Bézier曲线

    一般定义

    Bézier曲线可以定义为任意度n。

    Parameters

    • t: number

      插值度

    • ps: number[]

      点列表 ps.length == n+1

    • processs: number[][] = null

      收集中间过程数据,可用作Bézier曲线动画数据

    Returns number

  • n次Bézier曲线关于t的导数

    一般定义

    Bézier曲线可以定义为任意度n。

    Parameters

    • t: number

      插值度

    • ps: number[]

      点列表 ps.length == n+1

    Returns number

  • n次Bézier曲线关于t的dn阶导数

    Bézier曲线可以定义为任意度n。

    Parameters

    • t: number

      插值度

    • dn: number

      求导次数

    • ps: number[]

      点列表 ps.length == n+1

    Returns number

  • n次Bézier曲线关于t的二阶导数

    一般定义

    Bézier曲线可以定义为任意度n。

    Parameters

    • t: number

      插值度

    • ps: number[]

      点列表 ps.length == n+1

    Returns number

  • 立方Bézier曲线

    平面中或高维空间中(其实一维也是成立的,这里就是使用一维计算)的四个点P0,P1,P2和P3定义了三次Bézier曲线。 曲线开始于P0朝向P1并且从P2的方向到达P3。通常不会通过P1或P2; 这些点只是为了提供方向信息。 P1和P2之间的距离在转向P2之前确定曲线向P1移动的“多远”和“多快” 。

    对于由点Pi,Pj和Pk定义的二次Bézier曲线,可以将Bpipjpk(t)写成三次Bézier曲线,它可以定义为两条二次Bézier曲线的仿射组合:

    B(t) = (1 - t) * Bp0p1p2(t) + t * Bp1p2p3(t) , 0 <= t && t <= 1
    

    曲线的显式形式是:

    B(t) = (1 - t) * (1 - t) * (1 - t) * p0 + 3 * (1 - t) * (1 - t) * t * p1 + 3 * (1 - t) * t * t * p2 + t * t * t * p3 , 0 <= t && t <= 1
    

    对于P1和P2的一些选择,曲线可以相交,或者包含尖点。

    三次Bézier曲线相对于t的导数是

    B'(t) = 3 * (1 - t) * (1 - t) * (p1 - p0) + 6 * (1 - t) * t * (p2 - p1) + 3 * t * t * (p3 - p2);
    

    三次Bézier曲线关于t的二阶导数是

    6 * (1 - t) * (p2 - 2 * p1 + p0) + 6 * t * (p3 - 2 * p2 + p1);
    

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    • p2: number

      点2

    • p3: number

      点3

    Returns number

  • 三次Bézier曲线关于t的导数

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    • p2: number

      点2

    • p3: number

      点3

    Returns number

  • 三次Bézier曲线关于t的二阶导数

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    • p2: number

      点2

    • p3: number

    Returns number

  • 获取曲线在指定插值度上的导数(斜率)

    Parameters

    • t: number

      插值度

    • ps: number[]

      点列表

    Returns number

  • 查找区间内极值列表

    Returns

    极值列表 {} {ts: 极值插值度列表,vs: 极值值列表}

    Parameters

    • ps: number[]

      点列表

    • numSamples: number = 10

      采样次数,用于分段查找极值

    • precision: number = 0.0000001

      查找精度

    Returns {
        ts: number[];
        vs: number[];
    }

    • ts: number[]
    • vs: number[]
  • 获取单调区间列表

    Returns

    {ts: 区间节点插值度列表,vs: 区间节点值列表}

    Parameters

    • ps: number[]
    • numSamples: number = 10
    • precision: number = 0.0000001

    Returns {
        ts: number[];
        vs: number[];
    }

    • ts: number[]
    • vs: number[]
  • 获取曲线样本数据

    这些点可用于连线来拟合曲线。

    Parameters

    • ps: number[]

      点列表

    • num: number = 100

      采样次数 ,采样点分别为[0,1/num,2/num,....,(num-1)/num,1]

    Returns number[]

  • 获取曲线在指定插值度上的二阶导数

    Parameters

    • t: number

      插值度

    • ps: number[]

      点列表

    Returns number

  • 获取目标值所在的插值度T

    Returns

    返回解数组

    Parameters

    • targetV: number

      目标值

    • ps: number[]

      点列表

    • numSamples: number = 10

      分段数量,用于分段查找,用于解决寻找多个解、是否无解等问题;过少的分段可能会造成找不到存在的解决,过多的分段将会造成性能很差。

    • precision: number = 0.0000001

      查找精度

    Returns number[]

  • 获取曲线在指定插值度上的值

    Parameters

    • t: number

      插值度

    • ps: number[]

      点列表

    Returns number

  • 线性Bézier曲线 给定不同的点P0和P1,线性Bézier曲线就是这两个点之间的直线。曲线由下式给出

    B(t) = p0 + t * (p1 - p0) = (1 - t) * p0 + t * p1 , 0 <= t && t <= 1
    

    相当于线性插值

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    Returns number

  • 线性Bézier曲线关于t的导数

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    Returns number

  • 线性Bézier曲线关于t的二阶导数

    Parameters

    • _t: number

      插值度

    • _p0: number

      点0

    • _p1: number

      点1

    Returns number

  • 合并曲线

    合并两条连接的曲线为一条曲线并且可以还原为分割前的曲线

    Parameters

    • fps: number[]

      第一条曲线点列表

    • sps: number[]

      第二条曲线点列表

    • mergeType: number = 0

      合并方式。mergeType = 0时进行还原合并,还原拆分之前的曲线;mergeType = 1时进行拟合合并,合并后的曲线会经过两条曲线的连接点;

    Returns number[]

  • 二次Bézier曲线

    二次Bézier曲线是由函数B(t)跟踪的路径,给定点P0,P1和P2,

    B(t) = (1 - t) * ((1 - t) * p0 + t * p1) + t * ((1 - t) * p1 + t * p2) , 0 <= t && t <= 1
    

    这可以解释为分别从P0到P1和从P1到P2的线性Bézier曲线上相应点的线性插值。重新排列前面的等式得出:

    B(t) = (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2 , 0 <= t && t <= 1
    

    Bézier曲线关于t的导数是

    B'(t) = 2 * (1 - t) * (p1 - p0) + 2 * t * (p2 - p1)
    

    从中可以得出结论:在P0和P2处曲线的切线在P 1处相交。随着t从0增加到1,曲线沿P1的方向从P0偏离,然后从P1的方向弯曲到P2。

    Bézier曲线关于t的二阶导数是

    B''(t) = 2 * (p2 - 2 * p1 + p0)
    

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    • p2: number

      点2

    Returns number

  • 二次Bézier曲线关于t的导数

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    • p2: number

      点2

    Returns number

  • 二次Bézier曲线关于t的二阶导数

    Parameters

    • t: number

      插值度

    • p0: number

      点0

    • p1: number

      点1

    • p2: number

      点2

    Returns number

  • 分割曲线

    在曲线插值度t位置分割为两条连接起来与原曲线完全重合的曲线

    Returns

    返回两条曲线组成的数组

    Parameters

    • t: number

      分割位置(插值度)

    • ps: number[]

      被分割曲线点列表

    Returns number[][]

Generated using TypeDoc