贝塞尔曲线

定义

一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用它的顺序 (n = 1 为线性,2 为二次,等.)。第一个和最后一个控制点总是具有终结点的曲线;然而,中间两个控制点 (如果有的话) 一般不会位于曲线上 。

贝塞尔曲线包含两个控制点即 n = 2 称为线性的贝塞尔曲线

贝塞尔曲线包含三个控制点即 n = 3 称为二次贝塞尔曲线

贝塞尔曲线包含四个控制点即 n = 4,所以称为三次贝塞尔曲线。

线性的贝塞尔曲线

p0和p1两个点之间的线性插值的点p可以获得:

p = p 0 + t ∗ ( p 1 − p 0 ) p=p0+t*(p1-p0) \qquad p=p0+t(p1p0) (0 <= t <= 1)

线性的贝塞尔曲线有两个控制点。为给出了两个点 P0和 P1一个线性的贝塞尔曲线是只是这两个点之间的直线
B ( t ) = p 0 + t ∗ ( p 1 − p 0 ) = ( 1 − t ) ∗ p 0 + t ∗ p 1 B(t)=p0+t*(p1-p0)=(1-t)*p0+t*p1\qquad B(t)=p0+t(p1p0)=(1t)p0+tp1 (0 <= t <= 1)

贝塞尔曲线_第1张图片

二次贝塞尔曲线

二次贝塞尔曲线具有三个控制点。二次贝塞尔曲线是点对点的两个线性贝塞尔曲线的线性插值。为给出了三个点 P0、P1和 P2一条二次贝塞尔曲线,其实是两条线性的贝塞尔曲线,线性贝塞尔曲线的 P0和 P1和 线性贝塞尔曲线P1和 P2. 所以,给出二次贝塞尔曲线 :

B ( t ) = ( 1 − t ) ∗ B p 0 p 1 ( t ) + t ∗ B p 1 p 2 ( t ) B(t)=(1-t)*B_{p0p1}(t)+t*B_{p1p2}(t) \qquad B(t)=(1t)Bp0p1(t)+tBp1p2(t) (0=

B ( t ) = ( 1 − t ) ∗ [ ( 1 − t ) ∗ p 0 + t ∗ p 1 ] + t ∗ [ ( 1 − t ) ∗ p 1 + t ∗ p 2 ] B(t)=(1-t)*[(1-t)*p0+t*p1]+t*[(1-t)*p1+t*p2]\qquad B(t)=(1t)[(1t)p0+tp1]+t[(1t)p1+tp2](0=

二次贝塞尔最终公式:
B ( t ) = ( 1 − t ) 2 ∗ p 0 + 2 ∗ t ∗ ( 1 − t ) ∗ p 1 + t 2 ∗ p 2 B(t)=(1-t)^2*p0+2*t*(1-t)*p1+t^2*p2\qquad B(t)=(1t)2p0+2t(1t)p1+t2p2(0=

贝塞尔曲线_第2张图片

三次贝塞尔曲线

三次方贝塞尔曲线具有四个控制点。二次贝塞尔曲线是 点对点的两条二次贝塞尔曲线的线性插值。对于给出的四个点 P0、P1、P2和 P3三次方贝塞尔曲线,是二次贝塞尔曲线P0、P1和 P2和 二次贝塞尔曲线P1、P2和 P3 得到的 线性插值 .所以,给出三次方贝塞尔曲线

B ( t ) = ( 1 − t ) B p 0 p 1 p 2 + t ∗ B p 1 p 2 p 3 B(t)=(1-t)B_{p0p1p2}+t*B_{p1p2p3}\qquad B(t)=(1t)Bp0p1p2+tBp1p2p3(0<=t<=1)
拆分 = > => =>
B ( t ) = ( 1 − t ) ∗ [ ( 1 − t ) 2 ∗ p 0 + 2 ∗ t ∗ ( 1 − t ) ∗ p 1 + t 2 ∗ p 2 ] + t ∗ [ ( 1 − t ) 2 ∗ p 1 + 2 ∗ t ∗ ( 1 − t ) ∗ p 2 + t 2 ∗ p 3 ] 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]\qquad B(t)=(1t)[(1t)2p0+2t(1t)p1+t2p2]+t[(1t)2p1+2t(1t)p2+t2p3](0<=t<=1)

三次贝塞尔公式:

B ( t ) = ( 1 − t ) 3 ∗ p 0 + 3 ∗ ( 1 − t ) 2 ∗ t ∗ p 1 + 3 ∗ ( 1 − t ) ∗ t 2 ∗ p 2 + t 3 ∗ p 3 B(t)=(1-t)^3*p0+3*(1-t)^2*t*p1+3*(1-t)*t^2*p2+t^3*p3\qquad B(t)=(1t)3p0+3(1t)2tp1+3(1t)t2p2+t3p3(0<=t<=1)
贝塞尔曲线_第3张图片

应用

根据
二次贝塞尔最终公式:
B ( t ) = ( 1 − t ) 2 ∗ p 0 + 2 ∗ t ∗ ( 1 − t ) ∗ p 1 + t 2 ∗ p 2 B(t)=(1-t)^2*p0+2*t*(1-t)*p1+t^2*p2\qquad B(t)=(1t)2p0+2t(1t)p1+t2p2(0=
得到曲线上的点,然后通过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
/// 
/// 获取存储贝塞尔曲线点的数组
/// 
/// 起始点
/// 控制点
/// 目标点
/// 采样点的数量
/// 存储贝塞尔曲线点的数组
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

你可能感兴趣的:(3D数学基础图形与游戏开发)