Đồ họa máy tính - Chương 2 Các phép biến đổi hình trên hệ toạ độ - Bài 9 potx - Pdf 19

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

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

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

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

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

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

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

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

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

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

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

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

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;

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
(*)


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status