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

10 339 0
Đồ 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

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

Thông tin tài liệu

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 . 2, getmaxY div 2, getmaxX,getmaxY,false); line (-3 20 ,0,3 19, 0); line(3 19, 0,310 ,-5 ); line(3 19, 0,310,5); line(0 ,23 9, 0 , -2 40); line (-5 , -2 30,0 , -2 40); line(5 , -2 30,0 , -2 40); outtextxy (-1 0 ,-1 0,'O');. 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;. 2, getmaxY div 2, getmaxX,getmaxY,false); line (-3 20 ,0,3 19, 0); line(3 19, 0,310 ,-5 ); line(3 19, 0,310,5); line(0 ,23 9, 0 , -2 40); line (-5 , -2 30,0 , -2 40); line(5 , -2 30,0 , -2 40); outtextxy (-1 0 ,-1 0,'O');

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

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

Tài liệu liên quan