贝塞尔曲线工具类

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);
    }

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值