【日常】Bezier曲线

概述

1.贝塞尔曲线是什么?

贝塞尔曲线(bezier curve),又叫贝兹曲线/贝济埃曲线,本质上就是一段二维图形应用程序的数学曲线。它分为端点线段两部分,节点是可拖动的支点,线段像可伸缩的皮筋。

2.它可以做什么?

PS中的钢笔工具,部分游戏的道具飞行路径等

3.三阶贝塞尔曲线效果展示

请添加图片描述

贝塞尔曲线原理

1.什么是阶?
拿上面的效果图举例,我说了三阶贝塞尔曲线效果展示。那么什么是三阶呢?
两种理解:
	1.贝塞尔曲线是一个数学函数,那么N阶贝塞尔曲线就可以理解为N次方的意思,那么上面的三阶贝塞尔曲线就是三次方比塞尔曲线。
	2.三阶贝塞尔曲线就是在二阶贝塞尔曲线上在加一次一阶贝塞尔曲线,以此类推。
2.贝塞尔曲线的公式
  1. 一阶贝塞尔曲线

一阶贝塞尔曲线其实就是一个线段,给出两个点 P0,P1
P’ = P0 + (P1 - P0)t = tP2 + (1-t)P0 , t∈[0,1];
P0,P2已经很明确了,t是什么呢?
t是(0-1)的一个值,那么根据t就可知一阶贝塞尔曲线的t这个系数 P’ 是多少了

  1. 二阶贝塞尔曲线

二阶贝塞尔曲线,既然是二阶贝塞尔曲线那么就会有三个点 P0,P1,P2
同时拟定两个 P(A),P(B) 点在P1P2,P2P3两段线段上
P’ = P(A) + (P(B) - P(A))t , t属于[0,1]
P(A) = P0 + (P1 - P0)t , P(B) = P1 + (P2 - P1)t , t∈[0,1]
P’ = (1-t)P0 + 2t(1-t)P1 + t²P3 , t属于[0,1]
TrueType字型就运用了以贝兹样条组成的二次贝兹曲线。

  1. 三阶贝塞尔曲线

P0、P1、P2、P4四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P1走向P2,并从P3的方向来到P4。一般不会经过P2或P3;这两个点只是在那里提供方向资讯。P1和P2之间的间距,决定了曲线在转而趋进P4之前,走向P3方向的“长度有多长”。
公式为:在这里插入图片描述

  1. n阶贝塞尔曲线
    现代的成象系统,如PostScript、Asymptote和Metafont,运用了以贝兹样条组成的三次贝兹曲线,用来描绘曲线轮廓。一般参数公式阶贝兹曲线可如下推断。
    给定点P0、P1、…、Pn,其贝兹曲线即:
    在这里插入图片描述

相关代码

  1. 一阶贝塞尔曲线代码
	/// <summary>
    /// 一阶贝塞尔曲线代码
    /// </summary>
    /// <param name="pos1"> P0 </param>
    /// <param name="pos2"> P1 </param>
    /// <param name="step"> t </param>
    /// <returns>  </returns>
	private Vector3 _CalculateBezierPoint(Vector3 pos1,Vector3 pos2,float step)
    {
        return pos1 + (pos2 - pos1) * step;
    }

既然有了一阶的贝塞尔曲线代码,那么n阶自然就可以根据递归来计算出来:

	/// <summary>
    /// N阶贝塞尔曲线代码
    /// </summary>
    /// <param name="t"> t </param>
    /// <param name="posArr"> P0,P1,P2,P3... </param>
    /// <returns></returns>
    public Vector3 GetBezierPoint(float t,[NotNull]params Vector3[] posArr)
    {
        if (posArr.Length < 2)
        {
            if (posArr.Length <= 0)
            {
                return Vector3.zero;
            }
            else if(posArr.Length == 1)
            {
                return posArr[0];
            }
            else
            {
                return _CalculateBezierPoint(posArr[0],posArr[1],t);
            }
        }

        List<Vector3> tempList = new();
        for (int i = 1; i < posArr.Length; i++)
        {
            tempList.Add(_CalculateBezierPoint(posArr[i - 1],posArr[i],t));
        }

        return GetBezierPoint(t, tempList.ToArray());
    }

相关资料参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值