Kỹ thuật Đồ hoạ máy tính
48
$9. Dán các đờng cong Bezier
1. Dán các đờng cong Bezier
Giả sử trên đoạn [t
o
,t
1
] đã xây dựng đợc đờng cong Bezier Q
1
(t) t[t
o
,t
1
] và
trên đoạn [t
1
,t
2
] ta đã xây dựng đợc đờng cong Bezier Q
2
(t). Vấn đề là cần phải
dán Q
1
và Q
2
để đợc đờng cong Q(t) t[t
o
,t
2
] sao cho Q(t) có đạo hàm ở mọi
điểm t[t
o
,t
2
]
Rõ ràng ta có:
Qt
Qt t t t
Qt t tt
()
() [ , ]
() [ , ]
=
101
212
Trên từng khoảng [t
o
,t
1
] (t
1
,t
2
) Q(t) là đa thức có đạo hàm ở mọi điểm. Vấn đề chỉ
cần phải xét tại t=t
1
Giả sử trên [t
o
,t
1
] ta có các điểm
PP P
n0
1
1
11
, , là các điểm cho trớc của đờng
cong Bezier trên [t
o
,t
1
] và trên (t
1
,t
2
) ta có các điểm
PP P
n0
2
1
22
,, là các điểm
cho trớc của đờng cong Bezier trên (t
1
,t
2
) ở đây
PP
n
1
0
2
=
Từ tính chất của đờng cong Bezier ta có:
trên đoạn [t
o
,t
1
]:
=
Qt
n
t
PP
nn11
0
1
1
1
() ( )(*)
trên đoạn [t
1
,t
2
]:
=Qt
n
t
PP
21
1
1
2
0
2
() ( ) (**)
Với t
o
=t
1
-t
o
; t
1
=t
2
-t
1
. Để cho Q(t) có đạo hàm tại t1 thì
=
Qt Qt
11 21
() ()
=
11
0
1
1
1
1
1
2
0
2
t
PP
t
PP
nn
( ) ( ) (***)
Vì
PPx
n
1
0
2
==
điểm ứng với t
1
chia đoạn PPP
nn
1
11
1
2
,,
theo tỉ số
t
t
0
1
điều
kiện (***) là điều kiện để Q(t) có đạo hàm tại mọi t. Thực ra chúng ta chỉ cần
PPP
nn1
11
1
2
,, thẳng hàng
2. Thuật toán dán các đờng cong Bezier bậc II
Nh ta đã biết đờng cong Bezier bậc 2 chính là Parabol
Kỹ thuật Đồ hoạ máy tính
49
Giả sử cho trớc các điểm P
o
,P
1
,P
2
P
n
(n3), ta phải vẽ một đờng cong đi qua
các điểm này sao cho ở mỗi đoạn P
i
P
i+1
đờng cong là một Parabol và đờng cong
phải trơn bậc I có nghĩa là đờng cong phải có đạo hàm ở tất cả các điểm. Dựa vào
cách xây dựng đờng cong Bezier ở trên chúng ta có thể xây dựng thuật toán để tạo
nên đờng cong trơn bậc I nh sau:
Đ
V
o
=P
o
, V
2
=P
1
, i=1
V
1
lấy bất kỳ
Vẽ đờng cong Bezier bậc 2 qua 3
điểm V
o
,V
1
,V
2
Nối V
1
với V
2
kéo di lấy V'
1
sao cho V
1
V
2
= V
2
V'
1
STOP
i<n
V
o
=V
1
; V
1
= V'
1
, V
2
=P
i
i=i+1
S
Chơng trình minh hoạ :
USES graph,crt;
VAR
pi:array[0 2] of real;
u: real;
xi,yi:array[0 2,0 2]of real;
x,y:array[0 2]of real;
m,n:array[0 100]of real;
xdau,Gd,Gm,t,i,j,k,l:integer;
a1,b1,c,s:real;
f:text;
(*************************************************)
{ Ve he truc toa do }
procedure khoitao;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\tp\bgi ');
if GraphResult <> grOk then Halt(1);
Kü thuËt §å ho¹ m¸y tÝnh
50
directvideo:=False;
setbkcolor(1);
setcolor(14);
setviewport(getmaxX div 2,getmaxY div 2,getmaxX,getmaxY,false);
line(-320,0,319,0);
line(319,0,310,-5);
line(319,0,310,5);
line(0,239,0,-240);
line(-5,-230,0,-240);
line(5,-230,0,-240);
outtextxy(-10,-10,'O');
outtextxy(305,10,'x');
outtextxy(10,-230,'y');
end;
(*************************************************)
{thu tuc ve duong cong tron theo thuat toan CASTELJAU}
PROCEDURE ve;
Var
i,j : integer;
BEGIN
moveto(round(x[0]),round(y[0]));
for i:=0 to 2 do
Begin
yi[i,0]:=y[i];
xi[i,0]:=x[i];
End;
u:=0;
while u<=1 do
Begin
for j:=1 to 2 do
Begin
for i:=j to 2 do
Begin
xi[i,j]:=(1-u)*xi[i-1,j-1]+u*xi[i,j-1];
yi[i,j]:=(1-u)*yi[i-1,j-1]+u*yi[i,j-1];
End;
End;
{lineto(round(xi[i,j]),round(yi[i,j]));}
putpixel(round(xi[i,j]),round(yi[i,j]),WHITE);
delay(0);
u:=u+0.0001
End;
END;
(*************************************************)
{ Chuong Trinh Chinh }
Kỹ thuật Đồ hoạ máy tính
51
BEGIN
l:=6;
m[0]:=-90; n[0]:=100;
m[1]:=-60; n[1]:=60;
m[2]:=-40; n[2]:=70;
m[3]:=0; n[3]:=10;
m[4]:=60; n[4]:=140;
m[5]:=160; n[5]:=120;
m[6]:=260; n[6]:=220;
khoitao;
i:=0;
x[0]:=m[i]; y[0]:=n[i];
i:=i+1;
x[2]:=m[i]; y[2]:=n[i];
circle(round(x[2]),round(y[2]),2);
x[1]:=x[2]-15;y[1]:=y[2]-15;
circle(round(x[0]),round(y[0]),2);
circle(round(x[2]),round(y[2]),2);
ve;
while i<l do
Begin
x[0]:=x[2];y[0]:=y[2];
x[1]:=x[2]+(x[2]-x[1]);y[1]:=y[2]+(y[2]-y[1]);
i:=i+1;
x[2]:=m[i]; y[2]:=n[i];
circle(round(x[2]),round(y[2]),2);
circle(round(x[0]),round(y[0]),2);
ve;
End;
repeat until keypressed;
closegraph;
END.
3. Thuật toán dán các đờng cong Bezier bậc III
Phát biểu bài toán:
Giả sử cho trớc các điểm P
o
,P
1
,P
2
P
n
hãy xây dựng đờng cong Q(t) với
t[t
o
,t
n
] thoả mãn các điều kiện sau:
1. Đờng cong đi qua các điểm cho trớc Q(t
i
)=P
i
2. Trên mỗi khoảng [t
i-1
,t
i
] Q(t) là một đa thức bậc III
3. Q(t) và Q'(t) là các hàm liên tục trên [t
o
,t
n
]
Nói chung việc xây dựng Q(t) với các điều kiện trên là không duy nhất, nghĩa là có
thể có nhiều đờng cong thoả mãn điều kiện trên. Từ t tởng của cách xây dựng
đờng cong Bezier chúng ta sẽ xây dựng các đa thức bậc III trên từng khoảng [t
i-1
,
Kỹ thuật Đồ hoạ máy tính
52
t
i
, t
i+1
,] sau đó dán chúng lại, chỉ có khác là ta sẽ xây dựng sao cho Q (ti)=Pi
i=0,1, ,n
Thuật toán nh sau:
1. i=1
2. Qua P
i-1
, P
i
, P
i+1
sẽ có parabol đi qua ba điểm này
3. Parabol này sẽ có tiếp tuyến S
i
tại P
i
là : S
i
=(1-
i
)C
i-1
+
i
C
i
với C
i-1
=(P
i
-P
i-1
)/(t
i
-t
i-1
)
C
i
=(P
i+1
-P
i
)/(t
i+1
-t
i
)
i
=(t
i+1
-t
i
)/(t
i+1
-t
i-1
)
ta cho i=0 : S
0
=2(C
0
-S
1
), cho i=n : S
n
=2C
n-1
-S
n-1
4. Trên Si lấy P
i-1/3
, P
i+1/3
,
Sao cho
P
i-1/3
=P
i-1
+1/3*(t
i-1
- t
i-2
) S
i-1
P
i+1/3
,=P
i
-1/3*(t
i
-t
i-1
) S
i
5. Coi P
i-1
, P
i-1/3
, P
i+1/3
, P
i+1
đóng vai trò là V
0
,V
1
,V
2
,V
3
để vẽ đờng cong
Bezier bậc III qua 4 điểm (và đờng cong này đảm bảo đi qua P
i
)
6. i=i+1
7. Kiểm tra xem i>n hay cha nếu cha quay lại bớc 2
8. Kết thúc
Chơng trình minh hoạ :
Program Cong_bac_3;
USES graph,crt;
VAR
pi:array[0 3] of real;
u: real;
xi,yi:array[0 3,0 3]of real;
x,y:array[0 3]of real;
m,n,a,c,s:array[0 100]of real;
xdau,Gd,Gm,t,i,j,k,l:integer;
a1,b1:real;
f:text;
(*************************************************)
{ Ve he truc toa do }
procedure khoitao;
begin
Gd := Detect;
InitGraph(Gd, Gm, ' ');
if GraphResult <> grOk then Halt(1);
directvideo:=False;
setbkcolor(1);
setcolor(14);
setviewport(getmaxX div 2,getmaxY div 2,getmaxX,getmaxY,false);
line(-320,0,319,0);
Kü thuËt §å ho¹ m¸y tÝnh
53
line(319,0,310,-5);
line(319,0,310,5);
line(0,239,0,-240);
line(-5,-230,0,-240);
line(5,-230,0,-240);
outtextxy(-10,-10,'O');
outtextxy(305,10,'x');
outtextxy(10,-230,'y');
end;
(*************************************************)
{thu tuc ve duong cong tron theo thuat toan CASTELJAU}
PROCEDURE ve;
Var
i,j : integer;
BEGIN
moveto(round(x[0]),round(y[0]));
for i:=0 to 3 do
Begin
yi[i,0]:=y[i];
xi[i,0]:=x[i];
End;
u:=0;
while u<=1 do
Begin
for j:=1 to 3 do
Begin
for i:=j to 3 do
Begin
xi[i,j]:=(1-u)*xi[i-1,j-1]+u*xi[i,j-1];
yi[i,j]:=(1-u)*yi[i-1,j-1]+u*yi[i,j-1];
End;
End;
{lineto(round(xi[i,j]),round(yi[i,j]));}
putpixel(round(xi[i,j]),round(yi[i,j]),LIGHTMAGENTA);
delay(0);
u:=u+0.001
End;
END;
(*************************************************)
{ Chuong Trinh Chinh }
BEGIN
l:=8;
m[0]:=-290; n[0]:=-200;
m[1]:=-290; n[1]:=-200;
m[2]:=-190; n[2]:=-100;
Kü thuËt §å ho¹ m¸y tÝnh
54
m[3]:=-90; n[3]:=100;
m[4]:=-60; n[4]:=60;
m[5]:=-40; n[5]:=80;
m[6]:=0; n[6]:=10;
m[7]:=60; n[7]:=140;
m[8]:=160; n[8]:=120;
m[9]:=260; n[9]:=220;
khoitao;
i:=1;
c[0]:=0;
while i<=l do
Begin
x[0]:=m[i];y[0]:=n[i];
circle(round(m[i]),round(n[i]),2);
c[i]:=(n[i+1]-n[i])/(m[i+1]-m[i]);
a[i]:=(m[i+1]-m[i])/(m[i+1]-m[i-1]);
s[i]:=(1-a[i])*c[i-1]+a[i]*c[i];
i:=i+1;
x[3]:=m[i];y[3]:=n[i];
circle(round(m[i]),round(n[i]),2);
c[i]:=(n[i+1]-n[i])/(m[i+1]-m[i]);
a[i]:=(m[i+1]-m[i])/(m[i+1]-m[i-1]);
s[i]:=(1-a[i])*c[i-1]+a[i]*c[i];
x[1]:=m[i-1]+(m[i-1]-m[i-2])/3;
y[1]:=n[i-1]+(m[i-1]-m[i-2])*s[i-1]/3;
x[2]:=m[i]-(m[i]-m[i-1])/3;
y[2]:=n[i]-(m[i]-m[i-1])*s[i]/3;
ve;
End;
repeat until keypressed;
closegraph;
END.
Vi du 2 :
Program Cong_bac_3;
USES graph,crt;
VAR
pi:array[0 3] of real;
u: real;
xi,yi:array[0 3,0 3]of real;
x,y:array[0 3]of real;
m,n:array[0 100]of real;
xdau,Gd,Gm,t,i,j,k,l:integer;
a1,b1,c,s:real;
f:text;
Kü thuËt §å ho¹ m¸y tÝnh
55
(*************************************************)
{ Ve he truc toa do }
procedure khoitao;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\tp\bgi ');
if GraphResult <> grOk then Halt(1);
directvideo:=False;
setbkcolor(1);
setcolor(14);
setviewport(getmaxX div 2,getmaxY div 2,getmaxX,getmaxY,false);
line(-320,0,319,0);
line(319,0,310,-5);
line(319,0,310,5);
line(0,239,0,-240);
line(-5,-230,0,-240);
line(5,-230,0,-240);
outtextxy(-10,-10,'O');
outtextxy(305,10,'x');
outtextxy(10,-230,'y');
end;
(*************************************************)
{thu tuc ve duong cong tron theo thuat toan CASTELJAU}
PROCEDURE ve;
Var
i,j : integer;
BEGIN
moveto(round(x[0]),round(y[0]));
for i:=0 to 3 do
Begin
yi[i,0]:=y[i];
xi[i,0]:=x[i];
End;
u:=0;
while u<=1 do
Begin
for j:=1 to 3 do
Begin
for i:=j to 3 do
Begin
xi[i,j]:=(1-u)*xi[i-1,j-1]+u*xi[i,j-1];
yi[i,j]:=(1-u)*yi[i-1,j-1]+u*yi[i,j-1];
End;
End;
{lineto(round(xi[i,j]),round(yi[i,j]));}
Kü thuËt §å ho¹ m¸y tÝnh
56
putpixel(round(xi[i,j]),round(yi[i,j]),WHITE);
delay(0);
u:=u+0.0001
End;
END;
(*************************************************)
{ Chuong Trinh Chinh }
BEGIN
l:=6; {l phai la so chan}
m[0]:=-90; n[0]:=100;
m[1]:=-60; n[1]:=60;
m[2]:=-40; n[2]:=80;
m[3]:=0; n[3]:=10;
m[4]:=60; n[4]:=140;
m[5]:=160; n[5]:=120;
m[6]:=260; n[6]:=220;
khoitao;
i:=0;
x[0]:=m[i]; y[0]:=n[i];
i:=i+1;
x[2]:=m[i]; y[2]:=n[i];
circle(round(x[2]),round(y[2]),2);
x[1]:=x[2]-5;y[1]:=y[2]-5;
i:=i+1;
x[3]:=m[i]; y[3]:=n[i];
x[2]:=(8*x[2]-x[0]-3*x[1]-x[3])/3;
y[2]:=(8*y[2]-y[0]-3*y[1]-y[3])/3;
circle(round(x[0]),round(y[0]),2);
circle(round(x[3]),round(y[3]),2);
ve;
while i<l do
Begin
x[0]:=x[3];y[0]:=y[3];
x[1]:=x[3]+(x[3]-x[2]);y[1]:=y[3]+(y[3]-y[2]);
i:=i+1;
x[2]:=m[i]; y[2]:=n[i];
circle(round(x[2]),round(y[2]),2);
i:=i+1;
x[3]:=m[i]; y[3]:=n[i];
x[2]:=(8*x[2]-x[0]-3*x[1]-x[3])/3;
y[2]:=(8*y[2]-y[0]-3*y[1]-y[3])/3;
circle(round(x[0]),round(y[0]),2);
circle(round(x[3]),round(y[3]),2);
ve;
End;
Kỹ thuật Đồ hoạ máy tính
57
repeat until keypressed;
closegraph;
END.
$10. Kỹ thuật xây dựng các mặt cong
1. Mặt cong và các yếu tố cơ bản của mặt cong
Mặt cong tơng tự nh đờng cong nó có thể đợc cho dới dạng tham số
S(u,v)=(x(u,v),y(u,v), z(u,v)) (1)
chẳng hạn mặt hypeloid cho dới dạng:
S(u,v)=(v cos u, hu, v sin u)
ở đây các hàm x,y,z chúng ta luôn giả thiết là hàm liên tục của hàm hai biến (u,v)
thuộc miền D nào đó. Các tham số u,v đợc gọi là các tham số đờng cong toạ độ,
của các điểm trên mặt cong Nếu từ (1) chúng ta cố định v=
v
khi đó ta đợc:
Q(u)=S(u,
v
)=(x(u,
v
), y(u,
v
), z(u,
v
))
Q(u) sẽ là một đờng cong nào đó trên mặt cong S(u,v). Ta gọi Q(u) là các đờng
toạ độ.
Tơng tự nếu ta cố định u=
u
ta có Q(v)=S(
u
,v), Q(v) là đờng cong toạ độ trên mặt
cong S
Ví dụ
S(,)=(x(,), y(,),z(,))
xR
yR
zR
=
=
=
cos cos
sin cos
sin
(*)
0360
o
, 0360
o
Mặt S(,) xác định nh trên mặt cầu với = ta có đờng cong toạ độ là đờng
tròn;
= cũng tạo nên đờng cong toạ độ là đờng tròn.
2. Mặt cong Lagrang
Giả sử
Su PF u u u u
ii
i
n
() ()=
=
0
01
là một đờng cong nào đó, Fi(u) là hàm cơ sở của đờng cong, Pi là điểm thuộc
đờng cong. Các điểm Pi này lại có thể thuộc đờng cong thứ j nào đó cho bởi
phơng trình