Professional Documents
Culture Documents
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
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
+ L1 1 P1 P3 , 0;1 (2)
+ L2 1 P3 P2 , 0;1 (3)
P3
P2
P1
L 1 L1 L2 , 0;1 (4)
P3
P2
C
P1
Nếu ta đặt
2
B1 1 ; B2 1 ; B3 2
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,
p 1
C Bi , p Pi (5)
i 1
p i 1
Bi , p C ip1 i 1 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ụ 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à
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))
ctrpoint=[1 2;2 5;4 3;4.5 4;4.5 4;5 0;6 3.5;7 5;8 4.5];
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
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
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.
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
p 1
+ R 1 .
i 1
i, p
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
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
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
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
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
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ú ý: 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)