Tải bản đầy đủ (.pdf) (7 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (260.06 KB, 7 trang )

Kỹ thuật Đồ hoạ máy tính
58

Pv PG v
iijj
j
m
() ()=
=

0

Mặt cong s có thể viết dới dạng
Suv PF uG v
ij i j
j
m
i
n
(,) () () ()=
==

2
00

Với F
i
(u), G
j
(v) là các hàm cơ sở
Nếu chọn hàm cơ sở


Fu l u
uu
uu
ii
n
i
ki
k
ki
n
() ()==


=


0

Gv l v
v
v
vv
jj
m
j
kj
k
kj
m
() ()==



=


0

khi đó
Suv Pl vl u
ij
j
m
i
n
j
m
i
n
(,) () () (**)=
==

00

Chúng ta thể thấy mặt cong s đi qua điểm U
i
,v
j
S(u
i
,v

j
)=P
ij
Công thức (**) gọi là công thức mặt cong Lagrang
Mặt cong Lagrang có u điểm nó đi qua nxm điểm cho trớc và có đạo hàm cao tuỳ
ý. Do vậy nói chung mặt cong Lagrang có sai số rất lớn so với mặt cong thực phải
xây dựng


$11. Mặt cong Bezier
1. Mặt cong Bezier
Tình hình giống nh với đờng cong để có thể xây dựng mặt cong chính xác hơn khi
cho trớc một số điểm, ngời ta nghĩ đến việc xây dựng các mảnh mặt cong nhỏ hơn
và sau đó ghép nối chúng lại, mặt cong Bezier là mặt cong có dạng tham số:
Suv PB uB v
ij m
j
n
i
j
m
i
n
(,) () () ()=
==

2
00

ở đây BB

m
j
n
i
,

là các đa thức Berstein bậc m và n, u
o
uu
1
, v
o
vv
1
Kỹ thuật Đồ hoạ máy tính
59
u=u
o
+q(u
1
-u
o
) v=v
o
+r(v
1
-v
o
)
Các điểm Pij đợc gọi là các điểm kiểm tra của mặt cong Bezier. Có thể minh hoạ

các điểm này sắp xếp theo trật tự sau

Suy từ cách xây dựng đờng cong Bezier, chúng ta có thể nhận thấy 4 điểm
P
oo
,P
om
,P
no
,P
nm
là những điểm chắc chắn thuộc mặt cong S. Xét trờng hợp
n=m=3 khi đó mối liên hệ về giá trị và đạo hàm riêng ở các nút P
oo
,P
om
,P
no
,P
nm
đợc cho bởi công thức sau:
Su v Su v S u v S u v
Su v Su v S u v S u v
SuvSuvSuvSuv
SuvSuvSuvSuv
vv
vv
u u uv uv
uuu
v

u
v
(,) (,) (,) (,)
(,) (,) (,) (,)
(,) (,) (,) (,)
(,) (,) (,) (,)
''
''
''' '
''' '
00 01 00 01
10 11 10 11
00 01 00 01
10 11 10 11












=

1000
0001

33
00
00
33
10
3
0
00
3
0
00 0
3
00 1
3
00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33




























































uu
uu
PPPP
PPPP
PPPP
PPPP
v
v
v
v

u=u
1
-u

0
; v=v
1
-v
0
;
Ví dụ: Từ mối liên hệ trên ta có:
S(u
1
,v
1
)=P
33

S
u
(u
1
,v
1
)=
3

u
(P
33
-P
23
)
Kỹ thuật Đồ hoạ máy tính

60
S
v
(u
1
,v
1
)=
3

v
(P
33
-P
32
)
S
uv
(u
1
,v
1
)=
9


u
v
(P
22

-P
32
-P
23
+P
33
)
2. Dán các mặt cong Bezier
Giả sử chúng ta đã xây dựng đợc 2 mặt cong Bezier S
1
(u,v) nà S
2
(u,v)
S
1
(u,v) ở đây có miền xác định [u
o,
u
1
]x[v
o
,v
1
]
S
2
(u,v) có miền xác định [u
1,
u
2

]x[v
o,
v
1
]
Giả sử ta cần phải dán S
1
và S
2
dọc theo biên u=u
1
khi đó:
Với hàm S
1
ta đặt:
u=u
o
+p(u
1
-u
o
)
v=v
o
+r(v
1
-v
o
)
=

==

Suv PBpB r
ij n
i
m
j
j
m
i
n
1
1
00
(,) () () (*)
,

Với hàm S
2
ta đặt
u=u
1
+q(u
2
-u
1
)
v=v
o
+r(r

1
-r
o
)
=
==

Suv PBqBr
ij n
i
m
j
j
m
i
n
2
2
00
(,) () () (**)
,

Chúng ta có nhận xét trên biên u=u
1
các điểm kiểm tra của đờng cong Bezier tạo
nên biên u=u
1
điểm cuối của đờng Bezier theo v trên S
1
là điểm đầu của đờng

cong Bezier trên u
2

= =PP jm
nj j
1
0
2
0, (***)
Điều kiện hai điểm cho các đờng Bezier theo v nối với nhau và liên tục trên bờ u.
Việc nối để bảo đảm tính trơn của mặt cong đa về bài toán nối các đờng cong
Bezier
Bezier theo tham số v trơn ở các điểm
v
o
v
1
S
2
S
1
u
2
u
1
u
o
Kü thuËt §å ho¹ m¸y tÝnh
61
⇒== =PPP jm

nj j j
1
0
2
0, .
Ch−¬ng tr×nh minh häa :
USES graph,crt;
Const l=3;
VAR
pi:array[0 l] of real;
u,v,t: real;
xi,yi,zi,a,b,c:array[0 l,0 l] of real;
x,y,z:array[0 100] of real;
xdau,Gd,Gm,i,j,k,p:integer;
a1,b1,s:real;
st1,st2: string[1];
(*************************************************)
{ 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);
setlinestyle(0,0,0);
line(0,0,320,0);
line(-0,0,0,-240);

line(0,0,-240,240);
line(-5,-230,0,-240);
line(5,-230,0,-240);
line(310,-5,320,0);
line(310,5,320,0);
line(228,-235,240,-240);
line(235,-228,240,-240);
setlinestyle(1,0,0);
line(-320,0,0,0);
line(0,0,240,-240);
line(0,0,0,240);
settextjustify(0,2);
outtextxy(5,5,'O');
outtextxy(305,10,'x');
outtextxy(10,-230,'y');
outtextxy(240,-230,'z');
setlinestyle(0,0,0);
end;
Kü thuËt §å ho¹ m¸y tÝnh
62
(*************************************************)
procedure move_to(x,y,z: integer);
Begin
moveto(round(x+z/sqrt(2)),round(y+z/sqrt(2)));
End;
(*************************************************)
procedure line_to(x,y,z: integer);
Begin
lineto(round(x+z/sqrt(2)),round(y+z/sqrt(2)));
End;

(*************************************************)
procedure put_pixel(x,y,z,m : integer);
Begin
putpixel(round(x+z/sqrt(2)),round(y+z/sqrt(2)),m);
End;
(*************************************************)
{thu tuc ve duong cong theo thuat toan CASTELEJ}
PROCEDURE ve;
Var
i,j : integer;
BEGIN
for i:=0 to l do
Begin
xi[i,0]:=x[i];
yi[i,0]:=y[i];
zi[i,0]:=z[i];
End;
u:=0;
while u<=1.01 do
Begin
for j:=1 to l do
Begin
for i:=j to l 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];
zi[i,j]:=(1-u)*zi[i-1,j-1]+u*zi[i,j-1];
End;
End;
put_pixel(round(xi[i,j]),round(yi[i,j]),round(zi[i,j]),WHITE);

u:=u+0.001
End;
END;
(*************************************************)
{ Chuong Trinh Chinh }
Kü thuËt §å ho¹ m¸y tÝnh
63
BEGIN
a[0,0]:=-210; b[0,0]:=100; c[0,0]:=10;
a[0,1]:=-200; b[0,1]:=-100;c[0,1]:=-30;
a[0,2]:=-40; b[0,2]:=80; c[0,2]:=50;
a[0,3]:=160; b[0,3]:=40;c[0,3]:=20;
For i:=1 To l Do
Begin
For j:=0 To l Do
Begin
a[i,j]:=a[0,0]+i*10; b[i,j]:=b[0,0]+i*10; c[i,j]:=c[0,0]+i*10;
End;
End;
a[3,3]:=a[0,3]-50; b[3,3]:=b[0,3]+140;c[3,3]:=c[0,3]-20;
khoitao;
i:=0; j:=0;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);

outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+'
]');
i:=0; j:=l;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);


outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+'
]');
i:=l; j:=0;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);

outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+'
]');
i:=l; j:=l;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);

outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+'
]');
v:=0;
while v<=1.01 do
Begin
For k:=0 To l Do
Begin
For p:=0 To l Do
Begin
Kü thuËt §å ho¹ m¸y tÝnh
64
xi[p,0]:=a[p,k]; yi[p,0]:=b[p,k];zi[p,0]:=c[p,k];
End;
for j:=1 to l do
Begin
for i:=j to l do
Begin

xi[i,j]:=(1-v)*xi[i-1,j-1]+v*xi[i,j-1];
yi[i,j]:=(1-v)*yi[i-1,j-1]+v*yi[i,j-1];
zi[i,j]:=(1-v)*zi[i-1,j-1]+v*zi[i,j-1];
End;
End;
x[k]:=xi[i,j]; y[k]:=yi[i,j]; z[k]:=zi[i,j];
End;
ve;
v:=v+0.01
End;
repeat until keypressed;
closegraph;
END.















×