intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Đồ họa máy tính - Chương 4 Kỹ thuật xử lý hình khuất - Bài 12

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:9

116
lượt xem
14
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Phần hiển thị của hình Phần này chúng ta giải quyết bài toán sau: Giả sử đối t-ợng quan sát nằm trong vùng nhìn thấy, khi đó nó có ảnh trên mặt phẳng chiếu ?. Nếu bây giờ chúng ta thu nhỏ mặt phẳng chiếu, hãy xác định phần hình ảnh của đối t-ợng có trong mặt phẳng chiếu, chúng ta chú ý rằng vấn đề này rất phù hợp với yêu cầu đặt ra khi mô tả đối t-ợng trên máy tính.

Chủ đề:
Lưu

Nội dung Text: Đồ họa máy tính - Chương 4 Kỹ thuật xử lý hình khuất - Bài 12

  1. Kü thuËt §å ho¹ m¸y tÝnh Ch−¬ng 4 Kü thuËt xö lý h×nh khuÊt $12. PhÇn hiÓn thÞ cña h×nh PhÇn nµy chóng ta gi¶i quyÕt bµi to¸n sau: Gi¶ sö ®èi t−îng quan s¸t n»m trong vïng nh×n thÊy, khi ®ã nã cã ¶nh trªn mÆt ph¼ng chiÕu Π. NÕu b©y giê chóng ta thu nhá mÆt ph¼ng chiÕu, h·y x¸c ®Þnh phÇn h×nh ¶nh cña ®èi t−îng cã trong mÆt ph¼ng chiÕu, chóng ta chó ý r»ng vÊn ®Ò nµy rÊt phï hîp víi yªu cÇu ®Æt ra khi m« t¶ ®èi t−îng trªn m¸y tÝnh. NÕu chóng ta coi mµn h×nh lµ mÆt ph¼ng chiÕu hay mét vßng h×nh ch÷ nhËt (cöa sæ) trªn mµn h×nh lµ mÆt ph¼ng chiÕu (Trong Pascal, C ta gäi vïng chiÕu ®ã lµ ViewPort) Kh«ng gi¶m tæng qu¸t ta gi¶ sö cöa sæ trªn mÆt ph¼ng chiÕu cã kÝch th−íc [Xmin, §−êng th¼ng Mμn h×nh cöa sæ Xmax] x [Ymin,Ymax] 1. ThuËt to¸n Cohen Sutherland Xmax X O Xmin Ymin Ymax Y ThuËt to¸n Cohen Sutherland gi¶i quyÕt bµi to¸n lµm thÕ nµo ®Ó x¸c ®Þnh phÇn ®o¹n th¼ng cã trong mÆt ph¼ng chiÕu. Nãi mét c¸ch kh¸c lµm thÕ nµo ®Ó x¸c ®Þnh phÇn ®−êng th¼ng cho tr−íc cã trong Viewport Theo Cohen Sutherland mét cöa sæ sÏ chia mµn h×nh thµnh 9 phÇn mçi phÇn øng víi mét m· sè gåm 4 bit 65
  2. Kü thuËt §å ho¹ m¸y tÝnh Mét ®iÓm P bÊt kú thuéc mÆt ph¼ng chiÕu sÏ øng víi mét m· gäi lµ Kod(P) 1001 1000 1010 0001 Viewport 0010 0000 0101 0100 0110 Kod(P)=b4b3b2b1 Trong ®ã c¸c bi ®−îc x¸c ®Þnh nh− sau: ⎧b 1 = 1 nÕu P n»m ë bª n tr¸i cña cöa sæ ⎪ ⎪b 2 = 1 nÕu P n»m ë bª n ph¶i cña cöa sæ ⎨ (1) ⎪b 3 = 1 nÕu P n»m ë phÇn bª n d – íi cña cöa sæ ⎪b 4 = 1 nÕu P n»m ë phÇn bª n trª n cña cöa sæ ⎩ NÕu kh«ng tho¶ m·n ®iÒu kiÖn trªn th× b i = 0, i = 1, 4. Mét ®iÓm P(x,y) bÊt kú Kod(P)®−îc x¸c ®Þnh theo (1) nh− sau: b1=1 nÕu xxmax b3=1 nÕu y>ymax b4=1 nÕu y
  3. Kü thuËt §å ho¹ m¸y tÝnh ( Kod(P1) And Kod(P2) )≠0000 iii. cßn l¹i ®o¹n th¼ng sÏ n»m c¶ trong lÉn ngoµi cöa sæ nghÜa lµ khi ((Kod(P1) And Kod(P2) ) = 0000) And (( Kod(P1) ≠0000) Or (Kod(P2) ≠0000)) X¸c ®Þnh ®iÓm giao cña ®o¹n th¼ng víi c¸c c¹nh cña cöa sæ sau ®ã vøt bá phÇn kh«ng thuéc cöa sæ thuËt to¸n cã thÓ minh ho¹ b»ng h×nh sau: P'2 P2 Bá P4 P"1 Bá Bá Bá P'3 P'1 P1 P3 Cã thÓ m« t¶ thuËt to¸n Cohen-Sutherland nh− sau: Gi¶ sö ®iÓm P1 cã to¹ ®é lµ (x1,y1) vµ P2 cã to¹ ®é lµ (x2,y2) vµ cöa sæ nh×n cã to¹ ®é lµ (xmin, ymin)-(xmax,ymax) 1. TÝnh Kod(P1) vµ Kod(P2) 2. NÕu Kod(P1)=Kod(P2)=0000 th× P1P2 n»m trong nhÈy ®Õn 5 3. NÕu (Kod(P1) And Kod(P2))0000 th× P1P2 n»m ngoµi nhÈy ®Õn 6 4. Ng−îc l¹i kh«ng tho¶ m·n 2 ®iÒu kiÖn trªn thùc hiÖn - NÕu Kod(P1)=0000 th× ta ho¸n vÞ P1 víi P2 ®Ó Kod(P1)0000 vµ lÊy b4b3b2b1= Kod(P1) - NÕu b1=1 th× y1=y1+(xmin-x1)*(y2-y1)/(x2-x1); x1=xmin - NÕu b2=1 th× y1=y1+(xmax-x1)*(y2-y1)/(x2-x1); x1=xmax - NÕu b3=1 th× x1=x1+(ymin-y1)*(x2-x1)/(y2-y1); y1=ymin - NÕu b4=1 th× x1=x1+(ymax-y1)*(x2-x1)/(y2-y1); y1=ymax - Quay l¹i b−íc 1 5. VÏ ®o¹n th¼ng P1P2 6. KÕt thóc ë trªn chóng ta cã thùc hiÖn phÐp chia cho (x2-x1) vµ phÐp chia cho (y2-y1) cho nªn tr−íc tiªn chóng ta ph¶i xÐt c¸c tr−êng hîp x2=x1 vµ tr−êng hîp y2=y1, hai tr−êng hîp nµy ®¬n gi¶n tù lµm. Ch−¬ng tr×nh minh häa : Program Cohen_Sutherland; uses crt,graph; type code=array[1..4] of Byte; 67
  4. Kü thuËt §å ho¹ m¸y tÝnh var a1,b1,a2,b2 : Real; n,i, xmin,ymin,xmax,ymax,gd,gm:integer; b: code; (****************************************) Procedure Special_Line(x1,y1,x2,y2: Real); Var tg: Real; Begin If (x1=x2) And (x1>xmin) And (x1y2 Then Begin tg:=y1; y1:=y2; y2:=tg; End; If (y1ymin) Then Begin If y1ymax Then y2:=ymax; End; Line(Round(x1),Round(y1),Round(x2),Round(y2)); End; If (y1=y2) And (y1>ymin) And (y1x2 Then Begin tg:=x1; x1:=x2; x2:=tg; End; If (x1xmin) Then Begin If x1xmax Then x2:=xmax; End; Line(Round(x1),Round(y1),Round(x2),Round(y2)); End; End; (*****************************) Procedure Kod(x,y:real;var b:code ); Begin For i:=1 To 4 Do b[i]:=0; if(x < xmin) then b[1]:=1; if(x > xmax) then b[2]:=1; if(y < ymin) then b[3]:=1; if(y > ymax) then b[4]:=1; End; 68
  5. Kü thuËt §å ho¹ m¸y tÝnh (****************************************) Procedure Cohen_Sutherland_Clipping(x1,y1,x2,y2:Real); var c1,c2: code; chon,tong1,tong2,mu2: Byte; tgx,tgy : Real; Begin Repeat Kod(x1,y1,c1); Kod(x2,y2,c2); tong1:=0; tong2:=0; mu2:=1; For i:=1 To 4 Do Begin tong1:=tong1+c1[i]*mu2; tong2:=tong2+c2[i]*mu2; mu2:=mu2*2; End; If tong1+tong2=0 Then Begin chon:=1; line(Round(x1),Round(y1),Round(x2),Round(y2)); End Else If (tong1 And tong2)0 then Begin chon:=2; End Else Begin chon:=3; If tong1=0 then Begin tgx:=x1; x1:=x2; x2:=tgx; tgy:=y1; y1:=y2; y2:=tgy; End; Kod(x1,y1,b); if b[1]=1 then Begin y1:=y1+(xmin-x1)*(y2-y1)/(x2-x1); x1:=xmin End; if b[2]=1 then Begin y1:=y1+(xmax-x1)*(y2-y1)/(x2-x1); x1:=xmax End; if b[3]=1 then Begin x1:=x1+(ymin-y1)*(x2-x1)/(y2-y1); y1:=ymin 69
  6. Kü thuËt §å ho¹ m¸y tÝnh End; if b[4]=1 then Begin x1:=x1+(ymax-y1)*(x2-x1)/(y2-y1); y1:=ymax End; End; Until (chon=1) Or (chon=2); End; (****************************************) Begin clrscr; write('nhap toa do cua so xmin,ymin: '); readln(xmin,ymin); write('nhap toa do cua so xmax,ymax: '); readln(xmax,ymax); write('Nhap (a1,b1): '); readln(a1,b1); write('Nhap (a2,b2): '); readln(a2,b2); gd:=detect; initgraph(gd,gm,'c:\tp\bgi'); setbkcolor(Black); setcolor(red); rectangle(xmin,ymin,xmax,ymax); settextjustify(1,1); outtextxy(320,450,'HIEN THI MOT DOAN THANG TRONG MOT CUA SO CHO TRUOC'); outtextxy(320,470,'THEO THUAT TOAN COHEN-SUTHERLAND'); setcolor(WHITE); setlinestyle(1,0,0); line(Round(a1),Round(b1),Round(a2),Round(b2)); setlinestyle(0,0,0); If (a1a2)And(b1b2) Then Cohen_Sutherland_Clipping(a1,b1,a2,b2) Else Special_Line(a1,b1,a2,b2); readln; closegraph; End. 2. ThuËt to¸n Liang-Barsky ThuËt to¸n x¸c ®Þnh phÇn ®−êng th¼ng cña Cohen Shutherland t−¬ng ®èi ®¬n gi¶n vµ thuËn tiÖn, tuy nhiªn nã cã nh−îc ®iÓm khi ng−êi lÆp l¹i qu¸ tr×nh x¸c ®Þnh giao ®iÓm cña ®o¹n th¼ng víi cöa sæ ph¶i tiÕn hµnh nhiÒu phÐp nh©n, chia ®iÒu nµy sÏ dÉn ®Õn hËu qu¶ lµ thêi gian xö lý chËm, gÆp nhiÒu sai sè. Hai nhµ to¸n häc Liang vµ Barsky ®· ®−a ra mét thuËt to¸n kh¸c ®Ó kh¾c phôc nh−îc ®iÓm trªn. Gi¶ sö ®o¹n th¼ng cho d−íi d¹ng tham sè ®i qua 2 ®iÓm P1(x1,y1), P2(x2,y2) cã d¹ng: ⎧x = x 1 + tdx ⎨ (1) ⎩ y = y1 + tdy 70
  7. Kü thuËt §å ho¹ m¸y tÝnh t∈[0,1] víi dx=x2-x1; dy=y2-y1 Gi¶ sö cöa sæ giíi h¹n bëi hai ®iÓm ë gãc trªn bªn tr¸i vµ gãc d−íi bªn ph¶i (xmin,ymin) , (xmax,ymax) khi ®ã ®o¹n th¼ng thuéc vµo cöa sæ khi vµ chØ khi ⎧ x min ≤ x1 + tdx ≤ x max ⎨ ⎩ y min ≤ y1 + tdy ≤ y max ⎧x min - x 1 ≤ tdx ≤ x max - x 1 ⇔⎨ ⎩ y min - y1 ≤ tdy ≤ y max - y1 ⇔ t.pk≤qk , k=1,2,3,4 (2) Víi p1=-dx q1=x1-xmin p2=dx q2=xmax-x1 p3=-dy q3=y1-ymin p4=dy q4=ymax-y1 Tõ (2) ta suy ra: 1. NÕu cã k (b»ng 1 hoÆc 3) ®Ó pk=0 th× ®o¹n th¼ng song song víi mét c¹nh nµo ®ã cña cöa sæ 2. NÕu víi ∀k mµ pk≠0 th× ta x¸c ®Þnh t1 vµ t2 t1=Max{0,Max(qk/pk)} víi c¸c pk0 khi ®ã x¸c ®Þnh ®−îc ®o¹n th¼ng (xw1,yw1)-(xw2,yw2) n»m trong cöa sæ xw1=x1+t1*dx; yw1=y1+t1*dy xw2=x1+t2*dx; yw2=y1+t2*dy Ta cã thuËt to¸n Liang Barsky 1. ®Æt t1=0; t2=1; 2. TÝnh pk vµ qk theo c«ng thøc trªn víi k=1,2,3,4 3. NÕu cã pk=0 th× ®o¹n th¼ng song song víi 1 trong 2 c¹nh cña cöa sæ 4. NÕu pk0 (víi k=1,2,3,4) th× - Cho k ch¹y tõ 1 ®Õn 4 - ®Æt t=qk/pk - nÕu pk0 th× ®Æt t2=min(t2,t) 5. NÕu t1t2 th× P1P2 n»m ngoµi cöa sæ vµ kÕt thóc Ch−¬ng tr×nh minh häa : Program Liang_Barsky; Uses Crt,Graph; 71
  8. Kü thuËt §å ho¹ m¸y tÝnh Var gd,gm,k : integer; xmin,xmax,ymin,ymax : integer; a1,b1,a2,b2,dx,dy : Real; p,q : Array[1..4] Of Real; (*****************************) Procedure Special_Line(x1,y1,x2,y2: Real); Var tg: Real; Begin If (x1=x2) And (x1>xmin) And (x1y2 Then Begin tg:=y1; y1:=y2; y2:=tg; End; If (y1ymin) Then Begin If y1ymax Then y2:=ymax; End; Line(Round(x1),Round(y1),Round(x2),Round(y2)); End; If (y1=y2) And (y1>ymin) And (y1x2 Then Begin tg:=x1; x1:=x2; x2:=tg; End; If (x1xmin) Then Begin If x1xmax Then x2:=xmax; End; Line(Round(x1),Round(y1),Round(x2),Round(y2)); End; End; (*****************************) Procedure Liang_Barsky_Clipping(x1,y1,x2,y2: Real); Var xw1,yw1,xw2,yw2,t,t1,t2: Real; Begin t1:=0; t2:=1; dx:=x2-x1; dy:=y2-y1; p[1]:=-dx; p[2]:=dx; p[3]:=-dy; p[4]:=dy; 72
  9. Kü thuËt §å ho¹ m¸y tÝnh q[1]:=x1-xmin; q[2]:=xmax-x1; q[3]:=y1-ymin; q[4]:=ymax-y1; For k:=1 To 4 Do Begin t:=q[k]/p[k]; If p[k]t then t2:=t; End; If t1
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2