Đồ họa máy tính - Chương 4 Kỹ thuật xử lý hình khuất - Bài 12
lượt xem 14
download
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.
Bình luận(0) Đăng nhập để gửi bình luận!
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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài tập lớn môn đồ hoạ máy tính
1 p | 1163 | 170
-
Đề thi cuối kỳ và lời giải môn đồ họa máy tính
5 p | 1439 | 141
-
GIÁO TRÌNH ĐỒ HỌA MÁY TÍNH_TỔNG QUAN VỀ ĐỒ HỌA MÁY TÍNH
14 p | 382 | 127
-
GIÁO TRÌNH ĐỒ HỌA MÁY TÍNH_CÁC THUẬT TOÁN TÔ MÀU
16 p | 337 | 79
-
GIÁO TRÌNH ĐỒ HỌA MÁY TÍNH_HIỂN THỊ ĐỐI TƯỢNG HAI CHIỀU
7 p | 246 | 63
-
Thảo luận Môn Đồ họa máy tính
8 p | 204 | 31
-
Đề cương môn học: Đồ họa máy tính
6 p | 277 | 22
-
Bài giảng Đồ họa máy tính: Các thuật toán mành hóa - Ma Thị Châu
18 p | 229 | 17
-
Bài giảng Đồ họa máy tính: Phép chiếu (projection)
15 p | 260 | 14
-
Bài giảng Đồ họa máy tính: Các phép biến đổi 3 chiều
13 p | 178 | 13
-
Bài giảng Đồ họa máy tính: Mở đầu
8 p | 92 | 8
-
Bài giảng Đồ họa máy tính: Bài 1 - Lê Tấn Hùng
11 p | 60 | 8
-
Bài giảng Tổng quan đồ họa máy tính
11 p | 120 | 7
-
Bài giảng Đồ họa máy tính: Introduction 3D
9 p | 104 | 6
-
Bài giảng Đồ họa máy tính: Các thuật toán mành hóa - Ma Thị Châu (2017)
19 p | 44 | 6
-
Bài giảng Đồ họa máy tính: Đường cong và bề mặt II - Ma Thị Châu (2017)
15 p | 32 | 5
-
Bài giảng Đồ họa máy tính: Giới thiệu - Ngô Quốc Việt
16 p | 35 | 4
-
Bài giảng CAD/CAM/CNC - Bài 3: Đồ họa máy tính
18 p | 12 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn