You are on page 1of 13

ĐƯỜNG CONG BÉZIER

Đường cong Bézier

Cho hai điểm P1 và P2 trong mặt phẳng O . Khi đó, đoạn thẳng PP
1 2 có phương trình tham

số là

L    1    P1   P2 ,   0;1 (1)

P1 P2

L   được gọi là nội suy tuyến tính giữa P1 và P2 .

Nếu ta muốn nối hai điểm P1 và P2 bởi một đường cong thì có vô số đường như thế. Vì vậy

tốt hơn là ta thêm vào một điểm P3 . Có nhiều cách sử dụng P3 để xác định một đường cong

trong vô số đường nối P1 và P2 , ở đây ta sẽ dùng phương pháp nội suy tuyến tính. Tiến hành

nội suy tuyến tính giữa P1 và P3 , giữa P3 và P2 ta được

+ L1     1    P1   P3 ,    0;1 (2)

+ L2    1    P3   P2 ,    0;1 (3)

P3

P2

P1

Ta tiếp tục nội suy tuyến tính hai đoạn thẳng PP


1 3 và P2 P3 . Khi đó,

L    1    L1     L2   ,   0;1 (4)

Thay    vào (4) ta được


C    L      1    L1     L2  
 1    1    P1   P3    1    P3   P2 
2
 1    P1  2 1    P3   2 P2

Ta thấy C   là một đường cong trong mặt phẳng O .

P3

P2

C  

P1

C   được gọi là đường cong Bézier bậc 2.

Nếu ta đặt

2
B1    1    ; B2    1     ; B3   2

thì C   có thể viết dưới dạng

C    B1    P1  B2   P2  B3   P3

Các đa thức B1    , B2   , B3   được gọi là các đa thức cơ sở Bernstein. Tổng quát hóa,

một đường cong Bézier bậc p được định nghĩa bởi

p 1
C     Bi , p   Pi (5)
i 1

trong đó Bi , p   là đa thức Bernstein có công thức xác định là

p  i 1
Bi , p    C ip1 i 1 1   

Dãy đa thức cơ sở Bernstein  Bi , p   thỏa các điều kiện:


i 1, p 1

+ Bi , p    0,    0;1 .
+ B1, p  0   Bp 1, p 1  1 .

p 1 p 1
i 1 i 1 p  i 1 p
+  B     C
i 1
i, p
i 1
p  1       1     1 .

1
+ Tập hợp  Bi , p   đối xứng nhau qua đường thẳng  
i 1, p 1 2

Đường cong Bézier là một đường cong xấp xỉ, trong đó các điểm điều khiển không được nội
suy, đường cong này nằm bên trong đa giác điều khiển được tạo thành bằng cách nối tuyến
tính các điểm  P1; P2 ; P3 .

Ví dụ 1: Viết chương trình Matlab xây dựng đa thức Bernstein Bi , p   .

Chương trình con 1: Tính n!


function M=giaithua(n)
M=1;
if (n==0)
M=M;
else
for i=1:n
M=M*i;
end
end
M
Chương trình con 2: Tính tổ hợp chập k của n
function N=tohop(n,k)
N=0;
if (k>n)
N=N;
else
N=giaithua(n)/(giaithua(k)*giaithua(n-k));
end
N;
Chương trình con 3: Xây dựng đa thức Bernstein Bi , p  
function B=Berstein_p(xi,i,p)
n=length(xi);
B=zeros(n,1);
for j=1:n
B(j)=tohop(p,i-1)*(xi(j))^(i-1)*(1-xi(j))^(p-i+1);
end
B

Ví dụ 2: Viết chương trình Matlab vẽ các đa thức cơ sở Bernstein bậc 2.

Dựa vào chương trình con số 3 ta được chương trình sau:


clear all;
clc;
xi=0:0.001:1;
p=2;
figure;
axis([0 1 0 1]);
for i=1:(p+1)
B=Bernstein_p(xi,i,p);
plot(xi,B);
hold on
end
title('Graphs of B12, B22 and B32','Color','b','FontName','Bell
MT','FontSize',16)

Chạy chương trình trên ta được

Ví dụ 3: Viết chương trình Matlab vẽ đường cong Bézier bậc 6, biết các điểm điều khiển là

P1  0;0  , P2  0,1 , P3 1;1 , P4  2.5, 0.5 , P5  4;2  , P6  5;2.5 , P7  6;1

Dựa vào chương trình con 3 và công thức (5) ta được chương trình
clear all;
close all;
xi=0:0.01:1;
n=length(xi);
ctrpoint=[0 0;0 1;1 1;2.5 -0.5;4 2;5 2.5;6 1];
p=size(ctrpoint,1)-1;
B_Matrix=zeros(n,p+1);
for j=1:(p+1)
B_Matrix(:,j)=Bernstein_p(xi,j,p);
end
B_Curve=zeros(n,2);
for i=1:n
for j=1:(p+1)
B_Curve(i,1)=B_Curve(i,1)+B_Matrix(i,j)*ctrpoint(j,1);
B_Curve(i,2)=B_Curve(i,2)+B_Matrix(i,j)*ctrpoint(j,2);
end
end
plot(ctrpoint(:,1),ctrpoint(:,2),'--o','Color','r');
hold on
plot(B_Curve(:,1),B_Curve(:,2))

Chạy chương trình trên ta được

Ví dụ 4: Viết chương trình Matlab vẽ đường cong Bézier bậc p.

Chương trình con 4: Vẽ đường cong Bézier bậc p


function C=Bezier_curve_p(ctrpoint)
xi=0:0.01:1;
n=length(xi);
p=size(ctrpoint,1)-1;
B_Matrix=zeros(n,p+1);
for j=1:(p+1)
B_Matrix(:,j)=Bernstein_p(xi,j,p);
end
B_Curve=zeros(n,2);
for i=1:n
for j=1:(p+1)
B_Curve(i,1)=B_Curve(i,1)+B_Matrix(i,j)*ctrpoint(j,1);
B_Curve(i,2)=B_Curve(i,2)+B_Matrix(i,j)*ctrpoint(j,2);
end
end
plot(ctrpoint(:,1),ctrpoint(:,2),'--o','Color','r');
hold on
plot(B_Curve(:,1),B_Curve(:,2))

Với các điểm điều khiển

ctrpoint=[1 2;2 5;4 3;4.5 4;4.5 4;5 0;6 3.5;7 5;8 4.5];

ta gõ vào Command Window lệnh Bezier_curve_p(ctrpoint)và chạy được kết quả:

Đường cong Bézier hữu tỉ

Dạng hữu tỉ được dùng xuất phát từ thực tế là có các dạng hình học thông dụng không thể
được biểu diễn chính xác thông qua các đa thức, điển hình là các đường và các mặt conic
(trừ parabol). Trong toán học, tất cả các đường conic, bao gồm đường tròn có thể được biểu
diễn thông qua các phân thức hữu tỉ
X   Y   Z  
x    ; y    ; z    (6)
W   W   W  

trong đó X   , Y   , Z   ,W    là các đa thức.

Chẳng hạn, đường tròn tâm O  0;0  , bán kính R  1 có phương trình dạng (6) là

1 2 2
x    2
; y   
1  1  2

Đường cong Bézier hữu tỉ bậc p được định nghĩa bởi

p 1

 B   w P
i, p i i
C    i 1
p 1
(7)
 B   w
i 1
i, p i

với wi là các đại lượng vô hướng, còn được gọi là trọng số. Đa thức

p 1
W      Bi , p   wi
i 1

là hàm mẫu số chung. Thông thường, các trọng số được chọn là các số dương để đảm bảo
đặc tính bao lồi.

Phương trình (7) có thể được viết lại như sau:

p 1
C     Ri , p   Pi (8)
i 1

Bi , p   wi
với Ri , p    p 1
.
 B   w
i 1
i, p i

Dãy hàm  Ri , p   thỏa các tính chất sau:


i 1, p 1

p 1
+  R    1 .
i 1
i, p

+ R1, p  0   Rp 1, p 1  1


+ Nếu wi  1, i  1, p  1 thì Ri , p    Bi , p   .

Ví dụ 5: Viết chương trình Matlab vẽ đường cong Bézier hữu tỉ bậc p.

Chương trình con 5: Vẽ đường cong Bézier hữu tỉ bậc p


function R=R_Bern_p(weight,ctrpoint)
xi=0:0.01:1;n=length(xi);
p=size(ctrpoint,1)-1;
T_RB=zeros(n,p+1);
for j=1:(p+1)
T_RB(:,j)=Bernstein_p(xi,j,p);
end
M_RB=zeros(n,1);
for i=1:n
for j=1:(p+1)
M_RB(i)=M_RB(i)+T_RB(i,j)*weight(j);
end
end
RB=zeros(n,p+1);
for j=1:(p+1)
RB(:,j)=weight(j)*T_RB(:,j)./M_RB;
end
RB_curve=zeros(n,2);
for i=1:n
for j=1:(p+1)
RB_curve(i,1)=RB_curve(i,1)+RB(i,j)*ctrpoint(j,1);
RB_curve(i,2)=RB_curve(i,2)+RB(i,j)*ctrpoint(j,2);
end
end
plot(ctrpoint(:,1),ctrpoint(:,2),'--o','Color','r');
hold on
plot(RB_curve(:,1),RB_curve(:,2))

Với các điểm điều khiển

ctrpoint=[0 0;0 1;1 1;2.5 -0.5;4 2;5 2.5;6 1];


và trọng số

weight=[1 1/sqrt(2) 1 1/sqrt(2) 1 1/sqrt(2) 1]


Ta gõ vào command Window lệnh

R_Bern_p(weight,ctrpoint)
và kết quả nhận được
Nếu thay đổi vector trọng số đã cho bằng vector weight=[1 5 36 27 15 5 10] thì ta
được kết quả
Phép chiếu phối cảnh

Các đường cong hữu tỉ có phương trình như dạng (8) cho ta một biểu diễn hình học rất trực
quan nhưng đồng thời cũng tồn tại một số yếu điểm trong lập trình đồ họa.

Trong đồ họa máy tính, người ta thường dùng hệ tọa độ thuần nhất để biểu diễn một điểm
trong không gian 3 chiều. Mỗi tọa độ có 4 chiều: 3 chiều thông thường cộng với một chiều thứ
4. Cách biểu diễn này xem một đường cong hữu tỉ trong không gian 3 chiều là một phép chiếu
của đường cong đa thức trong không gian 4 chiều.

Mỗi điểm M  x; y; z  trong không gian 3 chiều đều có một tập hợp các tọa độ thuần nhất tương

ứng M w  xw; yw; zw; w  trong không gian thuần nhất 4 chiều. Ngược lại, luôn tồn tại một tập

vô hạn điểm trong không gian thuần nhất 4 chiều tương ứng với mỗi điểm trong không gian
xw yw zw
thường, bởi vì x  ,y  ,z  với mọi w  0 . Vì vậy, điểm M  x; y; z  là phép chiếu của
w w w
điểm M w  xw; yw; zw; w  lên siêu phẳng w  1 , trong đó gốc tọa độ là tâm chiếu và siêu phẳng

là không gian 3 chiều thông thường.

Ta định nghĩa một đường cong Bézier trong không gian tọa độ thuần nhất 4 chiều và tìm hình
chiếu của nó lên siêu phẳng w  1 . Phương trình của đường cong này có dạng

p 1
C     X   ;Y   ; Z   ;W      Bi , p   Pi w
w
(9)
i 1

trong đó Pi w   xiw ; yiw ; ziw ; wi    xi wi ; yi wi ; zi wi ; wi  . Từ (9) ta suy ra

p 1 p 1
+ X     Bi , p   xiw ;Y     Bi , p   yiw .
i 1 i 1

p 1 p 1
+ Z     Bi , p   ziw ;W     Bi , p   wi
i 1 i 1

Chiếu đường cong C w   lên siêu phẳng w  1 ta được đường cong

C     x   ; y   ; z   

trong đó
p 1 p 1

X    Bi, p   xiw  B   w x
i, p i i
+ x     i 1
p 1
 i 1
p 1
.
W  
 B   w
i 1
i, p i  B   w
i 1
i, p i

p 1 p 1
w
Y    B   y
i, p i  B   w y
i, p i i
+ y     i 1
p 1
 i 1
p 1
.
W  
 B   w
i 1
i, p i  B   w
i 1
i, p i

p 1 p 1

Z    Bi , p   ziw  B   w z
i, p i i
+ z     i 1
p 1
 i 1
p 1
W  
 B   w
i 1
i, p i  B   w
i 1
i, p i

Do vậy, đường cong C   có phương trình là

p 1

 B   w Pi, p i i
C     x   ; y   ; z     i 1
p 1
(10)
 B   w
i 1
i, p i

Sử dụng đường cong Bézier hữu tỉ, ta có thể biểu diễn chính xác các đường conic, điều mà
đường cong Bézier đa thức không làm được. Ví dụ, dùng đường cong Bézier hữu tỉ bậc 2 để
vẽ một phần ba đường tròn. Đường tròn tâm gốc tọa độ, bán kính đơn vị có phương trình là

2 2
 X     Y   
    1
W    W   

Từ đẳng thức trên ta suy ra

X 2    Y 2    Z 2    0 (11)

Do đó, đường cong Bézier đa thức của cung tròn trong hệ tọa độ thuần nhất nằm trên một mặt
nón của không gian thuần nhất, và phép chiếu phối cảnh đường cong này lên đường tròn cơ
sở của hình nón tạo nên cung tròn.

Tiếp theo, ta tìm hiểu cách xây dựng cung tròn sử dụng đường cong Bézier hữu tỉ: tam giác
điều khiển cung tròn phải là tam giác cân, hai trọng số của hai điểm điều khiển ở hai đầu cung
có thể chọn bằng 1 (tức w1  w3  1 ), trọng số ở giữa ( w2 ) bằng cosin của góc tạo bởi dây cung

(nối hai điểm đầu và điểm cuối của cung tròn) và một trong các cạnh của tam giác điều khiển.

Sau đây là chương trình Matlab vẽ cung tròn (có tên là Bezier_circle)

clear all;
clc;
r=1;
alpha=pi/3;
weight=[1 cos(alpha) 1];
ctrpoint=[-r*sin(alpha)/weight(1) r*cos(alpha)/weight(1);0
r/weight(2);...
r*sin(alpha)/weight(3) r*cos(alpha)/weight(3)];
figure;
axis equal
hold on
R_Bern_p(weight,ctrpoint)

Chạy chương trình trên ta được

Chú ý: Cách biểu diễn cung tròn bằng đường Bézier hữu tỉ bậc hai có một điểm yếu là khi góc
  90o thì điểm P2 sẽ di chuyển ra vô cực. Do đó, để tạo đường tròn hoàn chỉnh ta cần ít
nhất 3 cung tròn như vậy.

Bằng cách sử dụng các đường cong Bézier hữu tỉ bậc cao hơn chúng ta sẽ tạo ra đường tròn
hoàn chỉnh với số cung tròn cần ghép lại ít hơn.
Ví dụ 6: Viết chương trình Matlab sử dụng đường cong Bézier hữu tỉ bậc 5 để biểu diễn hoàn
chỉnh một đường tròn.

clear all;
clc;
r=1;
weight=[5 1 1 1 1 5];
ctrpoint=[0 -r;-4*r -r;-2*r 3*r;2*r 3*r;4*r -r;0 -r];
figure;
axis equal
hold on
R_Bern_p(weight,ctrpoint)

Chạy chương trình trên ta được kết quả

You might also like