Đồ 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

7 393 1
Đồ 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

Đang tải... (xem toàn văn)

Thông tin tài liệu

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. . line(310,5, 320 ,0); line (22 8 , -2 35 ,24 0 , -2 40); line (23 5 , -2 28 ,24 0 , -2 40); setlinestyle(1,0,0); line (-3 20 ,0,0,0); line(0,0 ,24 0 , -2 40); line(0,0,0 ,24 0); settextjustify(0 ,2) ; outtextxy(5,5,'O');. div 2, getmaxY div 2, getmaxX,getmaxY,false); setlinestyle(0,0,0); line(0,0, 320 ,0); line (-0 ,0,0 , -2 40); line(0,0 , -2 40 ,24 0); line (-5 , -2 30,0 , -2 40); line(5 , -2 30,0 , -2 40); line(310 ,-5 , 320 ,0);. ' ''' ' 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

Ngày đăng: 24/07/2014, 10:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan