一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用它的顺序 (n = 1 为线性,2 为二次,等.)。第一个和最后一个控制点总是具有终结点的曲线;然而,中间两个控制点 (如果有的话) 一般不会位于曲线上 。
贝塞尔曲线包含两个控制点即 n = 2 称为线性的贝塞尔曲线
贝塞尔曲线包含三个控制点即 n = 3 称为二次贝塞尔曲线
贝塞尔曲线包含四个控制点即 n = 4,所以称为三次贝塞尔曲线。
p0和p1两个点之间的线性插值的点p可以获得:
p=p0+t∗(p1−p0)p=p0+t*(p1-p0) \qquadp=p0+t∗(p1−p0) (0 <= t <= 1)
线性的贝塞尔曲线有两个控制点。为给出了两个点 P0和 P1一个线性的贝塞尔曲线是只是这两个点之间的直线 B(t)=p0+t∗(p1−p0)=(1−t)∗p0+t∗p1B(t)=p0+t*(p1-p0)=(1-t)*p0+t*p1\qquadB(t)=p0+t∗(p1−p0)=(1−t)∗p0+t∗p1 (0 <= t <= 1)
二次贝塞尔曲线具有三个控制点。二次贝塞尔曲线是点对点的两个线性贝塞尔曲线的线性插值。为给出了三个点 P0、P1和 P2一条二次贝塞尔曲线,其实是两条线性的贝塞尔曲线,线性贝塞尔曲线的 P0和 P1和 线性贝塞尔曲线P1和 P2. 所以,给出二次贝塞尔曲线 :
B(t)=(1−t)∗Bp0p1(t)+t∗Bp1p2(t)B(t)=(1-t)*B_{p0p1}(t)+t*B_{p1p2}(t) \qquadB(t)=(1−t)∗Bp0p1(t)+t∗Bp1p2(t) (0=<t<=1)
B(t)=(1−t)∗[(1−t)∗p0+t∗p1]+t∗[(1−t)∗p1+t∗p2]B(t)=(1-t)*[(1-t)*p0+t*p1]+t*[(1-t)*p1+t*p2]\qquadB(t)=(1−t)∗[(1−t)∗p0+t∗p1]+t∗[(1−t)∗p1+t∗p2](0=<t<=1)
二次贝塞尔最终公式: B(t)=(1−t)2∗p0+2∗t∗(1−t)∗p1+t2∗p2B(t)=(1-t)^2*p0+2*t*(1-t)*p1+t^2*p2\qquadB(t)=(1−t)2∗p0+2∗t∗(1−t)∗p1+t2∗p2(0=<t<=1)
三次方贝塞尔曲线具有四个控制点。二次贝塞尔曲线是 点对点的两条二次贝塞尔曲线的线性插值。对于给出的四个点 P0、P1、P2和 P3三次方贝塞尔曲线,是二次贝塞尔曲线P0、P1和 P2和 二次贝塞尔曲线P1、P2和 P3 得到的 线性插值 .所以,给出三次方贝塞尔曲线
B(t)=(1−t)Bp0p1p2+t∗Bp1p2p3B(t)=(1-t)B_{p0p1p2}+t*B_{p1p2p3}\qquadB(t)=(1−t)Bp0p1p2+t∗Bp1p2p3(0<=t<=1) 拆分=>=>=> B(t)=(1−t)∗[(1−t)2∗p0+2∗t∗(1−t)∗p1+t2∗p2]+t∗[(1−t)2∗p1+2∗t∗(1−t)∗p2+t2∗p3]B(t)=(1-t)*[(1-t)^2*p0+2*t*(1-t)*p1+t^2*p2]+t*[(1-t)^2*p1+2*t*(1-t)*p2+t^2*p3]\qquadB(t)=(1−t)∗[(1−t)2∗p0+2∗t∗(1−t)∗p1+t2∗p2]+t∗[(1−t)2∗p1+2∗t∗(1−t)∗p2+t2∗p3](0<=t<=1)
B(t)=(1−t)3∗p0+3∗(1−t)2∗t∗p1+3∗(1−t)∗t2∗p2+t3∗p3B(t)=(1-t)^3*p0+3*(1-t)^2*t*p1+3*(1-t)*t^2*p2+t^3*p3\qquadB(t)=(1−t)3∗p0+3∗(1−t)2∗t∗p1+3∗(1−t)∗t2∗p2+t3∗p3(0<=t<=1)
根据 二次贝塞尔最终公式: B(t)=(1−t)2∗p0+2∗t∗(1−t)∗p1+t2∗p2B(t)=(1-t)^2*p0+2*t*(1-t)*p1+t^2*p2\qquadB(t)=(1−t)2∗p0+2∗t∗(1−t)∗p1+t2∗p2(0=<t<=1) 得到曲线上的点,然后通过doTween的DOPath,或者编辑器画出曲线
function CalculateCubicBezierPoint(t, p0, p1, p2)
local u=1-t
local tt=t*t
local uu=(1-t)*(1-t)
local p=uu*p0+2*t*u*p1+tt*p2
return p
end
/// <summary>
/// 获取存储贝塞尔曲线点的数组
/// </summary>
/// <param name="startPoint"></param>起始点
/// <param name="controlPoint"></param>控制点
/// <param name="endPoint"></param>目标点
/// <param name="segmentNum"></param>采样点的数量
/// <returns></returns>存储贝塞尔曲线点的数组
function GetBeizerList(startPoint, controlPoint, endPoint,segmentNum)
local paths={}
for i=1,segmentNum do
local t=i/segmentNum
local p=CalculateCubicBezierPoint(t,startPoint,controlPoint,endPoint)
table.insert(paths,p)
end
return paths
end
参考: https://blog.csdn.net/u010019717/article/details/47684223 https://blog.csdn.net/BBoyLXiang/article/details/88815637