12月学习进度6/31——计算机图形学期末准备03Bezier曲线及MATLAB实现
Posted fu_GAGA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12月学习进度6/31——计算机图形学期末准备03Bezier曲线及MATLAB实现相关的知识,希望对你有一定的参考价值。
贝塞尔曲线
参考GAMES101计算机图形学视频
↑
讲得超级棒!
定义
Bezier曲线 —— 用给定的控制点定义曲线,控制点控制曲线的弯曲,不一定要全部经过所有控制点
1.如何画Bezier曲线(递归过程)
参数
t
∈
[
0
,
1
]
t∈[0,1]
t∈[0,1]
对于每一个
t
t
t :
- 针对每一个控制点所连的线段
b
i
b
i
+
1
b_ib_i+1
bibi+1 取点
b
i
′
b'_i
bi′,使得:
- ∣ b i b i ′ ∣ = t |b_ib'_i|=t ∣bibi′∣=t
- ∣ b i ′ b i + 1 ∣ = 1 − t |b'_ib_i+1|=1-t ∣bi′bi+1∣=1−t
- 连接 b i ′ b'_i bi′ 和 b i + 1 ′ b'_i+1 bi+1′ ,新构成的所有线段,重复上述取点 b i ′ ′ b''_i bi′′ 操作
- 重复1,2操作,直到线段数为1,则该线段上取的点就是该 t t t 对应的曲线上的点
遍历所有 t ∈ [ 0 , 1 ] t∈[0,1] t∈[0,1] ,则可以画出该组控制点对应的Bezier曲线
2.Bezier曲线的代数形式
b n ( t ) = Σ j = 0 n b j ∗ B j n ( t ) b^n(t)=Σ^n_j=0b_j*B^n_j(t) bn(t)=Σj=0nbj∗Bjn(t)
其中
B
j
n
(
t
)
=
C
n
i
∗
t
i
∗
(
1
−
t
)
n
−
i
B^n_j(t)=C^i_n*t^i*(1-t)^n-i
Bjn(t)=Cni∗ti∗(1−t)n−i
多项式对称:
C
n
i
=
C
n
n
−
i
C^i_n=C^n-i_n
Cni=Cnn−i
该公式可看做:
- 控制点 b j b_j bj 对多项式 B j n ( t ) B^n_j(t) Bjn(t) 的加权和;
- 多项式 B j n ( t ) B^n_j(t) Bjn(t) 对控制点 b j b_j bj 的加权和;
Bezier曲线的性质
Bezier曲线一定在其控制点的凸包中:
当控制点共线时 → 形成的Bezier曲线就是这条直线
分段Bezier曲线及连续性
当控制点较多时,不好控制,曲线较平滑,单个控制点的改变对曲线形状影响较小
常用:三次Bezier曲线(4个控制点)
矩阵形式表示
MATLAB实现(二维点)
function bezier(p0,p1,p2,p3)
%p0-p3是控制点
x_t = [];%存放曲线上x的坐标
y_t = [];%存放曲线上y的坐标
A = [-1 3 -3 1;3 -6 3 0;-3 3 0 0;1 0 0 0];
%三次的矩阵表示
for t = 0:0.001:1
%遍历每个t
x_it = [t^3 t^2 t 1] * A * [p0(1);p1(1);p2(1);p3(1)];
y_it = [t^3 t^2 t 1] * A * [p0(2);p1(2);p2(2);p3(2)];
x_t = [x_t,x_it]; %将本次计算的结果加入到结果矩阵中
y_t = [y_t,y_it];
end
plot(x_t,y_t);
【例子】
example 1:
p0 = [4 2];
p1 = [7 10];
p2 = [16 19];
p3 = [41 21];
bezier(p0,p1,p2,p3);
example 2:
p0=[-10,40];
p1=[3,45];
p2=[56,6];
p3=[8,9];
bezier(p0,p1,p2,p3);
以上是关于12月学习进度6/31——计算机图形学期末准备03Bezier曲线及MATLAB实现的主要内容,如果未能解决你的问题,请参考以下文章
12月学习进度7/31——计算机图形学期末准备04B样条曲线及其基函数的定义
12月学习进度8/31——计算机图形学期末准备05B样条曲线和基函数的性质
12月学习进度5/31——计算机图形学期末准备02规范化两点三次Hermite插值及MATLAB实现
12月学习进度9/31——计算机图形学期末准备06四阶三次B样条曲线矩阵形式推导及MATLAB实现