CHƯƠNG VI
THIT K ĐƯỜNG VÀ MT CONG
BEZIER VÀ B-SPLINE
Khác vi nhng phương pháp biu din mt và đưng bi các công thc toán hc
tường minh, đây ta s bàn đến các công c cho phép ch ra các dng đường và mt
khác nhau da trên các d liu.
Điu này có nghĩa là vi mt đường cong cho trước mà ta chưa xác định được công
thc toán hc ca nó thì làm thế nào để có th nm bt được dng ca đường cong đó
mt cách tương đối chính xác qua vic s dng mt tp nh các đim P0 , P1 ,... cùng
vi mt phương pháp ni suy nào đó t tp đim này để to ra đường cong mong
mun vi mt độ chính xác cho phép.
Có nhiu cách để nm bt được đường cong cho trước, chng hn:
Ly mt mu đường cong chng vài chc đim cách nhau tương đối ngn ri
tìm mt hàm toán hc và chnh hàm này sao cho nó đi qua các đim này và
khp vi đường cong ban đầu. Khi đó, ta có được công thc ca đường và dùng
để v li đường cong.
Cách khác là dùng mt tp các đim kim soát và dùng mt thut toán đểy
dng nên mt đường cong ca riêng nó da trên các đim này. Có th đường
cong ban đầu và đường cong to ra không khp nhau lm, khi đó ta có th di
chuyn mt vài đim kim soát và lúc này thut toán li phát sinh mt đường
cong mi da trên tp đim kim soát mi. Tiến trình này lp li cho đến khi
đường cong to ra khp vi đường cong ban đầu.
đây, ta s tiếp cn vn đề theo phương pháp th hai, dùng đến các đường cong
Bezier và B-Spline để to các đường và mt.
Gi s mt đim trong không gian được biu din dưới dng vector tham s p(t).
Vi các đường cong 2D, p(t) = (x(t), y(t)) và các đường 3D, p(t) = (x(t), y(t), z(t)).
6.1. ĐƯỜNG CONG BEZIER VÀ MT BEZIER
6.1.1. Thut toán Casteljau
Chương VI. Thiết kế đường cong và mt cong Bezier và B-Spline
Để xây dng đường cong p(t), ta da trên mt dãy các đim cho trước ri to ra giá
tr p(t) ng vi mi giá tr t nào đó. Vic thay đổi các đim này s làm thay đổi dng
ca đường cong. Phương pháp này to ra đường cong da trên mt dãy các bước ni
suy tuyến tính hay ni suy khong gia (In-Betweening).
Ví d: Vi 3 đim P0 , P1 , P2 ta có th xây dng mt Parabol ni suy t 3 đim này
bng cách chn mt giá tr t [0, 1] nào đó ri chia đon P0P1 theo t l t, ta được
đim P01 trên P0P1 . Tương t, ta chia tiếp P1P2 cũng theo t l t, ta được P11 . Ni P01
và P11 , li ly đim trên P01P11 chia theo t l t, ta được P02.
Vi cách làm này, ta s ly nhng giá tr t khác [0, 1] thì s được tp đim P02.
Đó chính là đường cong p(t).
Ta biu din bng phương trình:
P01(t) = (1-t).P0 + t.P1 (1)
P11(t) = (1-t).P1 + t.P2 (2)
P02(t) = (1-t).P01 + t.P11 (3)
Thay (1), (2) vào (3) ta được:
P(t) = P02(t) = (1-t)2.P0 + 2t.(1-t).P1 + t2.P2
Đây là mt đường cong bc 2 theo t nên nó là mt Parabol.
Tng quát hóa ta có thut toán Casteljau cho (L+1) đim:
Gi s ta có tp đim: P0, P1, P2, ..., PL
Vi mi giá tr t cho trước, ta to ra đim Pir(t) thế h th r, t thế h th (r - 1)
trước đó, ta có:
Pir(t) = (1-t).Pir-1(t) + t.Pi+1r-1(t) (3’)
r = 0,1,...,L i = 0,...,L-r
Thế h cui cùng P0L (t) được gi là đường cong Bezier ca các đim P0,P1 ,P2,...,PL
Các đim Pi , i=0,1,...,L được gi là các đim kim soát hay các đim Bezier.
Đa giác to bi các đim kim soát này gi là đa giác kim soát hay đa giác Bezier.
6.1.2. Dng Bernstein ca các đường cong Bezier
Đường cong Bezier da trên (L+1) đim kim soát P0 ,P1 , ...,PL được cho bi công
thc:
P(t) = P
k
L
=
0
k.BkL(t)
70
Chương VI. Thiết kế đường cong và mt cong Bezier và B-Spline
Trong đó, P(t) là mt đim trong mt phng hoc trong không gian.
BkL(t) được gi là đa thc Bernstein, được cho bi công thc:
B
kL(t) = L
kL k
!
!( )!(1-t)L-k.tk vi L k
Mi đa thc Bernstein có bc là L. Thông thường ta còn gi các BkL(t) là các hàm
trn (blending function).
Tương t, đối vi mt Bezier ta có phương trình sau:
P(u,v) = P
i
M
=
0i
L
=
0
i,k.BiM(u).BkL(v)
Trong trường hp này, khi đa din kim soát s có (M+1).(L+1) đỉnh.
P1
P0
1
P1
1
P0
2
P1
Đường cong Bezier bc 2 Đường cong Bezier bc 3
P2
Hình 6.1
6.1.3. Dng biu din ma trn ca đường Bezier
Để thích hp cho vic x lý trên máy tính, ta biu din hai mng BL(t) và P như
sau:
B
L(t) = (B0L(t), B1L(t), ..., BLL(t))
P = (P
0 ,P1 , ...,PL )
Do đó: P(t) = BL(t).P (tích hướng)
hay P(t) = BL(t).PT (PT là dng chuyn v ca P)
Dưới dng đa thc, có th biu din BkL(t) như sau:
BkL(t) = a0 + a1.t + a2.t2 + ... + aL.tL = (t0,t1,...,tL).(a0 ,a1 ,...,aL)
Do đó P(t) có th biu din li như sau:
P(t) = PowL(t).BezL.PT
Vi:
PowL(t) = (t0,t1,...,tL)
71
Chương VI. Thiết kế đường cong và mt cong Bezier và B-Spline
BezL là ma trn biu din mng BL(t) trong đó mi hàng i ca ma trn ng vi
các h s tương ng (a0 ,a1 ,...,aL) ca đa thc BiL(t) và ti v trí (i,j) trong ma trn BezL
có giá tr BezL(i,j) = (-1)j-i.Cni.Cij
Ví d: Ma trn Bez3 cho các đưng Bezier bc 3
Bez
3 =
1000
33 00
3630
13 31
−−
6.1.4. To và v các đường Bezier
Để to ra mt đường cong Bezier t mt dãy các đim kim soát ta s áp dng
phương pháp ly mu hàm p(t) các giá tr cách đều nhau ca tham s t, ví d có th
ly ti = i/N, i=0,1,...,N. Khi đó ta s được các đim P(ti) t công thc Bezier.
Ni các đim này bng các đon thng ta s đưc đường cong Bezier gn đúng. Để
tính P(ti) ta có th áp dng ma trn ca P(t) trên trong đó ch có thành phn PowL(ti)
là thay đổi, còn tích BezL.PT vi P = (P0 ,P1 , ...,PL ) là không thay đổi.
Sau đây là th tc minh ha vic v đường cong Bezier trong mt phng:
Type Mang = array[0..50] of PointType;
function tich(x,y:word):real;
var s:real;i:word;
begin
if y<=1 then tich:=1
else begin
s:=1;
for i:=x to y do s:=s*i;
tich:=s;
end;
end;
function CLK(l,k:word):real;
begin
CLk:=tich(k+1,l)/tich(1,l-k);
end;
function Xmu(x:real;mu:word):real;
72
Chương VI. Thiết kế đường cong và mt cong Bezier và B-Spline
var i:word;s:real;
begin
if mu=0 then s:=1
else begin
s:=1;
for i:=1 to mu do s:=s*x;
end;
Xmu:=s;
end;
function BKL(t:real;l,k:word):real;
begin
BKL:=CLK(l,k)*xmu(1-t,l-k)*xmu(t,k);
end;
procedure Pt(t:real;L:word;A:Mang;var diem:PointType);
var k:word;s,x,y:real;
begin
x:=0; y:=0;
for k:=0 to L do
begin
s:=BKL(t,l,k);
x:=x+A[k].x*s;
y:=y+A[k].y*s;
end;
diem.x:=round(x);
diem.y:=round(y);
end;
procedure Vebezier(A:Mang;L:integer);
var i,SoDiem:word; Diem:PointType;
dx,x:real;
begin
sodiem:=100;
dx:=1/sodiem;
73