贝塞尔曲线工具类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//贝塞尔曲线 https://www.jianshu.com/p/0c9b4b681724
public class BezierHelper {

    ///
    //2次贝塞尔曲线 B(t) = P0 + t(P - P0) => B(t) = (1 - t) P0 + t P1.
    //实际上是Lerp函数
    public static Vector3 GetPoint2 (Vector3 p0, Vector3 p1, float t) {
        return (1 - t) * p0 + t * p1;
    }

    /
    //这实际上是一条线性曲线,P0和P1被两条新的线性曲线代替了 
    //3次贝塞尔曲线  B(t) = (1 - t) ((1 - t) P0 + t P1) + t ((1 - t) P1 + t P2) =>B(t) = (1 - t)2 P0 + 2 (1 - t) t P1 + t2 P2
    //导数 B'(t) = 2 (1 - t) (P1 - P0) + 2 t (P2 - P1)
    public static Vector3 GetPoint3 (Vector3 p0, Vector3 p1, Vector3 p2, float t) {
        t = Mathf.Clamp01 (t);
        float oneMinusT = 1f - t;
        return
        oneMinusT * oneMinusT * p0 +
            2f * oneMinusT * t * p1 +
            t * t * p2;
    }

    public static Vector3 GetFirstDerivative3 (Vector3 p0, Vector3 p1, Vector3 p2, float t) {
        return
        2f * (1f - t) * (p1 - p0) +
            2f * t * (p2 - p1);
    }

    ///
    //4次 B(t) = (1 - t)3 P0 + 3 (1 - t)2 t P1 + 3 (1 - t) t2 P2 + t3 P3
    //导数 B'(t) = 3 (1 - t)2 (P1 - P0) + 6 (1 - t) t (P2 - P1) + 3 t2 (P3 - P2).
    public static Vector3 GetPoint4 (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {
        t = Mathf.Clamp01 (t);
        float oneMinusT = 1f - t;
        return
        oneMinusT * oneMinusT * oneMinusT * p0 +
            3f * oneMinusT * oneMinusT * t * p1 +
            3f * oneMinusT * t * t * p2 +
            t * t * t * p3;
    }

    public static Vector3 GetFirstDerivative4 (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {
        t = Mathf.Clamp01 (t);
        float oneMinusT = 1f - t;
        return
        3f * oneMinusT * oneMinusT * (p1 - p0) +
            6f * oneMinusT * t * (p2 - p1) +
            3f * t * t * (p3 - p2);
    }

}

 

你可能感兴趣的:(常用算法总结,c#,unity3d)