1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Thuật toán nhanh áp dụng đối với đồ thị 3d với 94 hình minh hoạ

70 9 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 70
Dung lượng 10,15 MB

Nội dung

ĐẠI HỌC QUỐC GIA H À NỘI HU'ÒN phân m n VI lim; điiy kinh n cliiệm , nhữnu n sờ i dơn sian chi imiùn c ó dợc nhữiiũ h.:im sỏ’ d ặc biV1 có the luỳ V sử dựng mà k h ó n g cán phải lốn nhiều 1hịi siian s u y Iichĩ Ilh trờnc hợp đặc biệt hay tối li hố tóc độ U2ĨII n c ữ lập trình c d ọ c dull" irong sách c ó ral nhiều II d iem bói đa ni nh ữ nc m ã lập c ó lính kh;i ch uyên hiệu quà T u y nhiên, đáp ứng dợc nhũng V to n a n cỏ ii ngũ' lập trình mức cao Bạn d ọ c nên c ỏ nhữiis’ hiếu biết CO' ban 11SĨI1 ngữ lập trình c Bạn đ ọ c d ễ d n g nhận thấy trình thực m ột c h o n g trình dài iàm v iệ c v ó i c c b iế n chứa vị trí nhớ cùa liệu CŨI12 dề- d àng nh làm việc VỚI nhiều danh sách cá c s i trị dũ' liệu cù n g loại T h e o nh lieu tic eiui cu ố n sách chúng lói s5 khơng đé cập tới nhĩiMũ ihuật (oán phức tạp nh phons; pháp theo dấu tia đè tạo d ó huạ m áy lính chái lo n c a o h a y phơUQ pháp radiosity Hon nữa, đối lợ n e luồn sắ n lien h oặc tách rời nhữ ng kh ối da diện mil troné chứa s ố lợn? đa eiác nhãì dịnh T h u ật toán th e o dấu lia cán thiết để ụ o dợc hình anh ¡al thục, c h í c ị n c ó kha nàng tạo ảnh phức lạp T uy nhiéú, bạn m u ốn làm d ợ c đ ié u đ ó bạn cẩn có nhũns máy vi linh-chạy cới lóc dỏ nhann p h ổ b iên thị trờnc m ót s ố lợna lớn đĩa lù Đ ẽ c ó tạo hàim irũn khối tin ir o n s m v vi tính phức tạp ch ú n e ta phai cán nhiêu ihiKi! luán khác P h n g pháp cùa ihức CO' C U Ó I1 s c h n a \ ia c ù n s m ộ t l ú c b n v é l ý i h u v ế i lạp tr ìn h t iiú 'i thiệu vớ i bail clot kiên C c d i n h n s h ì a k i e u b i ế n t o n CL1C \'a m a c r o d c m ó t a i r ứ c k i n p d ụ n s i ãn d ấ u l i ẽ n MỎI m ỏ ! c h 01 lí.' ironi : c u o i i 5>aji doc v iẽ i d a tren n h n s c h o n s irớc d ó N ế u nh ban c h ù d é i h õ n u disnsz t hì íi n h ấ t b a n C Ũ I 12 n é n d ọ c lới q u a qua n h ĩm u CỊU C II V O ! I ih ữ i i' - iraiiii ¡h i.il no- T ấ t cà bien loàn cục, macro chức nâng tạo n gu yên m au đ ợ c nêu lên bán phụ lục cùa sách Tóm lại, nói sách tập trung vào đ iể m sau * Cung cấp kiến thức toán c áp dụng ch o đ hoạ D * Dần dần phát triển chơng trình đổ hoạ hồn hảo c ó khà nàng đ a bàn hình D m ột cách nhanh chóng, g m c ả b ó n g - đợc phản ch iếu độ e iớ i hạn, bàn Iiày đợc giữ tệp Postscript Các hình ảnh đ ợc m tà số n g động qua tác đ ộng qua lại lẫn qua cá c tệp hoạt hình Một chuỗi cá c hình ảnh đợc tạo thời gian thực c h n g trình cài đật vào m ột máy vi tính c ó khà n ăng tạo đ vẽ m àu giá trị R G B (m hình cộ n g màu c bản) lập phần tử ảnh những; màu ảnh Bộ biến dịch c đờng thảng phàn cách siũa hai điểm hình, c ó thể làm đầy c c đa g iá c lồi * Minh hoạ kỹ thuật lập trình c CỊI1 c ó ch ứ c năn? tạo với việc nhấn mạnh tính ch u y ển tốc độ Nếu bạn d ọc cịn cha quen với ngơn ngữ lập trình c thấy sách c ó íclì việc giúp bạn hiểu rõ s ó o học phân phối giãi lồ dịng liệu * Cung cấp ch o bạn dọc mã nguồn c h n g trình lập trình d ho với giúp đỡ mã nguồn này, có khả thích ứng m ã m i thực thơng tin m ới (ví dụ nh dễ dàng g iớ i thiệu loại đ n g c o n g sp lin e hay họ ngơn ngữ lập trình giao diện, m ới ) Lời cảm ơn Đ ể viết đợc sách ihành cô n g nh th ế này, tối đ ợc nhiều bạn bồ dỏng nghiệp nil viện nghiên cứu giúp đỡ ý tịn® viết C11 sách dã xuất tòi từ nhiều năm trớc đ y lừ tỏi cịn dang làm việc với ơng Stew s M Slaby tròng đại h ọ c lổ n g hợp Binceton Bên cạnh Stewe, ngời dã dóng góp nhiều v iệ c đ a nhữiig sáng kiến, phơng pháp yếu ý tỏng t 'khí Lái đầu u ỏ Silvio le v y thuộc vieil tốn học n s ngời viết ùn Lỏng vào s ự thành c ô n g sách Trong thời gian viết cu ốn sách tỏi nhặn đợc nhiều ủng hộ, hồ (rợ củ a Dave D obkin, viện khoa học m áy tính, cù n g bạn bè làm v iệ c phịng thí n gh iệm đ hoạ vi tính tơng tác Tơi chùn thành cám ơn đ n g nghiệp cùa tỏi viện hàn lâm khoa h ọc áo nh Reinhard, Thaller, Leonid D im itrow Emanuel W enger giú p tơi nhiều q trình viết sách T i câ m ƠIÌ hai sinh viên làm v iệ c cù n g với T hom as Grohser Heinrih Pom m er, cá hai đa nhiều ý kiến để cải tiến m ã tốc độ Và cuối cù n g xin cảm ơn ỏng H ellm uth Stachel, W olfga n g Rath, viện nghiên cứu hình học tròng đại học k ỹ thuật V iên ông Otto Prem, viện H andelsakadem ie St Johann im Pongau, ngời đa cho nhiều lời khuyên cũ n g nhũng ngời dã cù n g với Silvio Levy d ọc sửa bán in c u ố n sách Gợi ý d ọc sách tham kháo Danh sách nhũng sách đồ hoạ D dài ỉà vô dụng nh đ ọ c tấc chúng Đ ể c ó thể hiểu sách kỷ hơn, bạn đọc nên tìm đ ọ c tham kháo thêm sácli sau * Sách viết v ề ngôn ngữ lập trình c {D A R N S S ), ỊK E R N S ố } * G iả thuyết đổ hoạ D {H E A R } , {H O SC $ ) , { N E W M S } , { P L A S } ( R O G E ) , {T H A L } , {P O L E } , { V I N C Ị N ộ i dung Những nét c bán hình học phàn tích khơng gian V éc tơ Cách đo chiều dài d o gó c Giao đ ò n g mặt phẳng Tịnh tiến M a trận Hĩnh chicu Hình chicii li lilí’- tám Chỏ]) quan i;il H ệ ihunu loạ dô Q ua lại ciữa hệ loạ dỏ Thuật tốn tãl xun MO ui dối lợns: kliơnc, sia n ba cliiéu Virnc liêu Cấu trúc "Bổ mật" "Khối đa diện" Các hình lồi Bé mặt quay Bể mặt dịch Phán s ia o đối tơng Xuất đổ hon Phán n e đ hoa Các chức nãnu vil macro phụ thuộc hệ ihốn Cách tạo b a n s màu cách sù' d ụ n c K h u n s dây lạo hàm theo chiều sáu Tỏ bóns Thuậi loan XI KÌ Ì dỏ hoa c bán Thuúi loan nhanh VC bc mặt an Các đỏi tợn cỡ dull ị : bao lỏi Bé mặi qua} Bé mặt cắt Đỏ thị ham sỏ Thư tự II liên irong so cá c dôi long Danh sách thứ nr II í lỏn cuối cùnií Tạo nhóm đ ối [ợng H ợ p g i ó i h a n v m ậ l p h ả n g pliãii Các dặc d icm cai licn V ỏ lịi Sự giao cua vó lồi B óng ánh phán chiếu M ỏ hình Sư khúc xạ, cá c dõi tọng iron" stiỏi Di ch u y ên CỈỜIIÍỊ khuất Phong pháp h ó n g hình nhanh Di ch uyến đờne; khuất cá c dối tong có đừng bao lối Đ ệ m theo chicu sâu đc thấy dợc Các dừng b ể mật toán học Đ n g c o n g d ợc tham sỏ hoá Các lúp mặt phang iliam s ố hoá Bố mặt lạo boi cá c phong trình an Các đùiiíi, đặc biệl Iron cá c bé mặt tốn học Mù hình roi phức lạp hưn Đ é m búny ch o bỏng Đừng inái pliant» Spline Đ ò n g va phang [lỏi suy h Đ n g mặt phẳng long dong Đ n g c o n g dặc biệt lien be mặt da giác lioá Đ n s c o n g tácli họp không gian M ột vài v í dụ ứng dụng Phim ành đợc thực máy vi tính Phơng pháp lu trữ m ột phim hiệu quà D uyệt phim nhanh Bộ ch ơn g trình lập trình đĩa từ N ộ i dung củ a dĩa từ Cách cài đặt ch on g trình Cách sử dụng ch on g trình Cách viết tếp liệu tệp hoạt hình Cách viết tệp liệu liệu hoạt hình m áy vi lính cúa bạn chạy nhanh [ill th ế nào? Phụ thuộc hệ thống ngùn ngữ lập trình khác Cách dối lệnh phụ thuộc hệ thống "Macromania" c, A N S IC hay c++? Thuật tốn trỏ ngơn ngữ lập trình P A S C A A L Tham khảo Phụ lục I NHỮNG NÉT C BÀN T R O N G HÌNH H Ọ C PHÂN T ÍC H KHÔ N G GIAN Trong ch o n g trình chúng tỏi đề cập đến vấn đề phỗ biến , ch u n g hình học phàn tích giãi pháp hữu hiệu áp dụng vói vấn đề chúng tơi giới thiêu ln tht tốn COI1 trỏ ch o nhữna nhà lập trình cịn thiếu kinh nghiệm để họ hiếu đợc vấn để phức tạp Chúng tơi sỗ khơng đề cặp tới hình học k h ô n g gian hai chiều bời tất cá ch ú n g ta quen thuộc khái niệm hình học khơng gian nh v iệ c nói hiIih h ọc không gian ba chiểu lúc không vấn đề phức tạp Hơn th ế nhiéu ngun tắc cù a hĩnh học khơng gian áp d ụ n s đ ối vói hinh h ọc k h ôn g siaii hai chiều mà k h ô n g cần phái thay đổi nhiều Trôn thực tế, hầu hết nlmg vãìi dề đ ề cập đến ị' phân l i 1.4 c ó điếm tơng tự nh k h ô n g d a n hai chiều ( ví dụ Iih phần giao g ó c đo đ n g ) c ó thể đọc giài đơn giàn bãiig cách bỏ toạ độ thứ ba T uy nhiên vài vấn đề không gian hai chiều đặc biệt đợc đ ề cập đền nhữno chơnsi khác 1.1 V e c to \ C húng tỏi coi hệ thỏv.í loạ dộ Cartesian k h ô n g clan ba chiều dựa trẽn ba Irục g ia o pairwise, x,y,z hình ) M ỗi đ iể m p irong không sian c ó nhfrtii: loạ độ d u y ,Px,ỉ5y,ỉJz.và ch ú n g viết p (Px,Pv,Pz) v éc tơ p op tính lì: đ iểm g ố c (0 , 0, ) tói I11 p đợc g ọ i c é c t định vị điếm p, đợc viết nil sau V é c tơ p cũ n g c ó thê Jợc diễn dịch nh tổ hợp tuvến tính cù a ba v éc tơ ctoi vị trực g ia o - ba vóc tơ n:.v c ó thổ xác định rõ cá c véc ;ơ đơn vị H ã y đ ể toạ độ đ iểm Q (qx,qv, qz), cù n g với v é c tc định vị q = q x.q y, o z), thành m ột đ iểm khác trc:;g không gian lúc ta ó véc tơ pQ Iih sau cụ thể là, PQ = q - p s float x m in , xm ax, ym in, ymax; {/* b e g in (bắt đầu) x y - region ( ) */ M ax - X = Clip - vol [ 0] = xmax; Min - X = Clip - vol [ I ] = xmin; M ax - y = Clip - vol [ 2] = ymax; M in - y = Clip - vol [ 3] = ymax; }/ * k ế t thúc x y - region ( ) */ Khi cử a s ổ đ hoạ mờ, ta viết: x y - region (0 , W in d o w - width, 0 , W in d o w - height); Bây giò' ta đa trỏ vào m ột hàm G lobal ỉn it - fptr (clip - line, clip2cl - line); ( □ proto.h) G lobal Inii - fpir (draw - line, q u ick - line); ( z proto.h) /* H ùm quick - line ( ) đ ợc giải thích phần 4.2 */ M ột hàm clip - and - plot - line ( ) c ó dr.il" nil sau: void c lip - and - pld - line (p, q) ( I proto.h) vector p, q: {/* bắt đầu clip - and - plđ - line ( ) * / vector p o, C'O; B ool exists: if ( ! c lip - line ( & e xists, pO, qO, p, q draw - line p, q); e ls e i f (exists) draw - line ,p0, qO); }/* k ế t thúc clip - and - plot - lin e ( ) * 5- K h i la phủi liên hành eal xén ch iể u hoậc k h i la muốn có kiêu d uim khác (nh đ n c X O R ) la de draw - line hàm tơnn ứnc V iệc qiủp la ciọc d ạc m2 nhanh ta c ó the irdnh đ ạc nlìiẻu phán nhánh điều kiỏn Cát x é n ba chiổu đờna w Khi k h ỏ n c chúa c;ic d icm cấ m , la clc irỏ chi h;'im: clip - line = clipSd - line; Đ e uchiùn cứu mã đ ối với hàm elip d - line ( ) la m ỡ Ộ112 khái niệm vuna ir o n s k h ô n g cian ba chiều: float M in - M ax - z; ( I G lo b als.h ) /* G iá trị z m ặt p h ả n s cát xén xa cần đợc để cập iron hệ tuyến lín h (Phép b iế n đổi 21) * / # d efin e M A X - P O L Y - SIZE s char R e g [ M A X - P O L Y - SIZE]; Ị* K h ô n g gian C Ũ I12 ( □ M acros.h ) ( z G lobals.h ) s ẽ đ ọ c s d ụ n g ch o cắt xén đa s iá c :i' # d efin e I N F R O N T Ox 10 # d efin e B E H IN E x ( _ Macros.il) _ M acros.hj char c lip - reg [G] = (R IG H T LEFT A B O V E B E L O W , IN F R O N T B E H IN O }; / * Tuàn e u e ir o n s m ô dun h iên hành ~ d e fin e K e ỗ io n d ( r e il X V z ’l [ \ R e a io n l i e u X, y j : , if (z ) M a x - z Z Z z < - I ) \ r c g ~ = IN F R O N T ;' eise i f (z < Min - z ) \ r e s I = B E H IN D \ _ M a c ro s il } Đ ố i vói v iệ c cãt XÚI chiêu Jicu quan trọng mã iri L cua đicni trồn đờng đợc b iến dối bủng phép biốn đòi tuyến linh (21) giú trị c u a cao J ic m k h ổ n g thay đổi lúc IK1V ¡’.ảm irons k h oáng - < < z Trớc ch ú n g ta tiữn hanh việc cũt xén ta khái địn-ỉ ;dc mặl piiản« củi xén: z void z - region (íar near) Proto.h) float far, near; { /* but đáu z - region ( ) * / M a x - z = C lip - vol [4 ] = near M in - z = C lip - vol [5 i = far; }/ * Kốt thúc z - region ( ) * / Các giá trị tốt ch o việc khỏi d ộng là: z - region ( - , 4.0); Lúc tấc c ả điếm nằm sau mặt phang cát xén x a k f : = -0,8 d / (1 0.S) = - d tất điểm nằm tróc mặt phàng cát xén gần Kn phái đ ọc tiến hành trớc cất x é n vùng vẽ: Nếu đinh cú a m ộ t cạn h năm "nửa k h ô n g gian cám" đ iể m ánh cùa nám vùng vẽ Tuy nhiên Sau xén mật phang K f đình phủi đ ợc thav bàng 1đ iếm , cát anh củ a c ó the năm nuồi vùng vẽ Phép nội s u y giao điếm cùa dòng với mật phung cắt xén d ơc thực bới hàm void im p el (r, a b, c) rigistcr float * r; / :i‘ kct dã d ọc Mỏi suV */ register float * a, *b, / * Hai diem mút */ register sh ort i; / * Thõiiiĩ tin VC thứ tự X, V, {/* bất đầu intpol ()*/ static c h c [6 ] [3] = (ì z */ I X ,Y ,Z X ,Y ,Z , Y,z,x, Y z X Z ,X ,Y , Z X Y ; ; char c l , c , c3; float t; c l = c [ i ] [ X ] , c = [ i ] [ Y ] c = [i] [Z]; t = (Clip - vol [i] - u [c 1) / (b [c I ] - a [c 1] + EPS); r [ c l ] = Clip - vol [ij; r [c2] = a [ c ] + t * (b [c2) - a [c2]) r [c3] = a [c3] + t * (b [c3] - a[c3]); / * kết thúc intplol ( ) */ Cuối cù n g m ã để cắc xén ba chiều nh sau: # d efin e Point - region (reg, p) Ị/ ( I M acros, h) x = ( p ) [ X ] , y = ( p ) [ Y ] ; z = (p) [Z];\ R egion 3d (r e s , X, y, z) ;\ ] # d efin e C o p y - vec (r, v ) \ ((r) [X] = (V) ( □ M acros.h ) [X ], (r) [Y] = (v) [Y], (D ) [Z] = (v) [Z]) # d efin e C o p v - c e c (r,v)\ ( I M acros, h ) ((r)[X ] = ( v ) t X ] , ( r ) [ Y ] = ( v ) [ Y ] Bood clip 3d - line (ex ists, pO, qO, p, q) ( □ Proto.h) Bool * exists; / * Đ n g có nằm ngồi tập hay k h òn ?*/ Vector p r q; / * Các đinh cúa d òng */ Ị / * Bắt dáu clip 3d line ( ) */ register lon g X, y; register short i; float z : ' P o i n i - r e g i o n ( R cỉi ( v ) p ); P o i n t - r e g i o n ( R e g [ J Cịj; i f (! ( R e g [0] Z R e g []]')) /* k h ô n g cắt x é n * / relurn FALSE; *exists = F A L SE ; for (i = 5, i > = 0, i - -) i f ( R e c [0] & R e g [ 1] &i Clip - regie]) return T R U E , / * Đ n g năm n g oài hộp */ C opy - v ec (p , p); C o p y - v ec (qO, q); for (i = , i < 6; i + + ) I i f ( R e g [0] & R e g [ 1] & Clip - reg [i]) return T R U E ; / * Đ n g nằm n g oà i hộp */ i f ((R eq [0 ] z R e g [ I ] S i Clip - reg [i] / * Đ i ể m đ a u riêu n ằ m * / intpol (po, C]0, pũ, i); e ls e / * Đ iể m thứ hai nằm » s o i :'7 intpol (qO pũ qO, i): i f (i > ) í Point - reg io n ( R e s [0], p0), Point - r e s io n ( R e g [ I ] , q 0); - ) } / * K ci Ihue if (R e g [0] */ }/* Két thúc * e x is ts = T R U E : }/* K ết thúc c ỉip d - line (, ) */ Cãt xén hai ch iều m ót đa w eiác Trớc v ẽ b iéu d ỏ i da c i c hai c h ié u m n hình, ta nên CŨI x é n da giUv d ỏ b a n s cử a s ổ vẽ V iệ c r.àv s ẽ ciú p la liếp k iêm đoc thời s ia n nhiéu tí: ẹiac 5S nằm ngồi cửa sổ V i ệ c cất xén cần thiết ch ú n g ta lu trữ đa g iá c dem dùng lại saư (ch ơn g 9) Hình 10 ch o ta thấv H od gm an Sutherland d ã tiến hành cắ t x é n đa g iá c tái lập nh thố Tiến hành cắt xén cúa cử a sổ , nên để c ó đợc I đa giác cắt xén hồn háo tiến hành tối đa bớc Thuật tốn tong đối nhanh V ì lý tốc độ, ta sừ dụng hai đa g iá c tạm thời T m p l [ ] Tm pt2[] ta lu g iữ c c kẽì tạm thời M ã đợc ghi theo cá ch để v iệ c cát xén thực đợc với cá m ảng V ecto r2 s m n g V ecto rs (T a lợi d ụ n g v iệ c c ả loại trỏ đ ối với m àng c ủ a floats.) float * T m p tl [ M A X - P O L Y - SIZE], * T m p [ M A X - P O L Y - SIZE]; (G Globals.h) short Init (D im , 2); ( □ G lob als.h ) /* Khi đa giác m àng cùa V e c to r ba ch iều, Dill phải = 3! * / Hình 10 - Thuật toán H od gm an - Sutherland đ ù n g đ ể cắt xén m ộ t đa g iá c thực làm bớc Bool clip 2d - p o ly g o n (n o , polyO, n, p o ly ) ( ũ p r o to h ) short *n0; /* K íc h c ỡ cù a đa giác c u ố i cù n g */ V ector p oly []; / * Đ a giác cu ối cù n g * / Short n; / * s ố c c đỉnh */ float p o ly []; / * M àn g cù a V ector2s h o ặ c vector * {/* bắt đầu clip d - polygon ( ) */ static float additional [8 * s i z e o f (V ecto r)], * add; /* Tối d a g ia o đ iểm rộng trò * / register char * reg = R eg; char *hi - l e g = rcg + n, code; 59 register float * p = poly, *q; short e d g e , m, c l , c2; float **r; float * * p poly; / *Con trò đối vơi T m p l T m p 2*/ float * * pp; ** hi - pp; /* Các trỏ chi pplv [ ] */ float t short cut - o f f = 0; cut - o f f = 0; for (; reg < hi - reg ++, p + = D im ) { X = p [x], y = p[Y]; R e g io n (* reg, X, y); i f (* reg! = 0; + + cut ! - off; Ị/* K ết thúc for (reg) */ *reg = R e g [0]; i f ( c u t - O f f = = 0; return FA L S E e ls e i f (cut - o ff = = II) Ị / * Đ a g iá c có ĩhể nằm ngồi cứa sổ */ for ( e d g e = 0; e d s e < 4; e d s e + + ) { co d e = Chip - r e s [edge]; for (reg = res; res < hi - reg; reg ++) i f (! (* reg & cod e)) break; i f (reg = = hi - res) { / * Đ a giác nàm nsoài cửa sổ.*/ * nO = 0; return T R U E ; 60 ' }/* K ết thúc i f (reg) */ }/ * Kết thúc for (ed ge) */ } /* Kết thúc if ( c u t - o f f ) * / p = poly; * n = n; /* Gán COI1 trỏ cho đình cùa đa giác */ hi - pp = (pp = ppoly = T m p l) +n; for (; pp < hi - pp; pp + + , p + = Dim) *pp = p; c = X; c = Y; add = additional; for ( e d g e = 0; ed g e < 4; edge ++){ co d e = Clip - reg [edge]; if (ed g e = = c l = Y ; c = X; for (hi -rcg = (reg = R eg) + *n0; reg < hi - reg; reg ++) if (*reg & codc, break; if (reg < hi - rcg) { m = Clip - vo i [edge]; hi - pp = * pp; r = p p oly = (ppoly = = tm p l? tmp2: T m p l); reg = Reg; w h ile (pp < hi - pp){ p = * pp ++ ; q = *pp; if (* reg + + & cod e) { if ( ! (* reg & cod e)) { 61 * r + + = add; add [ c i ] = m; i = ( m - p [ c l ] ) / (q [ c l] - p [cl]; add [c2] = p [c2] + (q [c2] - p [c2] ) * t; add + = Dim; } / * K ế t thúc if (* reg) */ } c ls e { * r + + = p; i f (* reg & cod e) Í * r * * = add; add [ c l ] = in; t = (m - q [ c l ] ) / ( p [ c l] - q [ c l] ) ; add [c2] = q [c] + (p [c2J - q [c2] * t; i f (D im = = 3) add [z] = q [z] + (p [z] - q [z] **; }/* K ế t thúc i f (* res ) * / } / * K ế t thúc i f (* rcg) */ } /* K ế t thúc w hile Ipp) * / pp = ppdy; i f ( e d g e < ) { * xác định vùng đọc thay đổi * / for (reg = reg; pp < r; reg ++, pp ++){ p = * pp; X = p [X]; y = p [Yj: R e g io n (* reg, X, y): } / * K ế t thúc for (reg) ;7 62 * r c g = K eg [OJ } / * két thúc if [cdi>e]*/ * nO = = I - ppoly; if = ( * nO < ) ( *1)0 = return T R U E ; }/* kết thúc if (* nO) */ }/* Kết thúc if (reg) * / ) / * K ết thúc for (e d g e ) * / p = & p o ly [0] [0]; hi - pp = ( p p = ppoly) + *n0; i f (D im = = 2) for (; pp < hi - pp; pp ++; p + = D im ) C opy - v e c @ (p, * pp) ; else for (; pp < hi - pp; pp + + , p+ = D im ) C op y - vec (p, * pp); return T R U E : Ị / * K ết thúc clip2d - p o ly s o n ( ) * / Ta lại đa trò chi ) hàm: ( _ P r o io h ) Global inil - fpir (clip - p o ly s o n , clip d - p o ly s o n ); H àm clip - and - draw - p o iv g o n ( ) nh sau: Global 111it - fpir (draw - p o ly g o n , fill - poly); ( L Proto.h) / *H àm fill - poly ( ) đợc s ià i thích phán * / void dip - and - draw - p o ly g o n (II, p o ly ) 63 ( L i P ro to.h) short a; float poly []; {/* bat đáu clip - and - draw - polygon ( */ static short nO; V ector polyO ( M A X - PO LY - SIZE); / * Đ ay không gian dành riêng ch o đa giác đ ợc cát xén :7 if ( ’ ciip p o ly gon ( & nO polyO 11, pol)) draw - p o ly g o n (u, pdy); ciiic if (nO > = 3) draw - p o ly gon (nO poly 0;); }/* K ết thúc clip - and - draw - polygon ( ) * / K hi ta m uốn tiến hành vát xén ba chiểu, vẽ dờng bao củ a đa g iá c h o ãc sử dụng kiểu đ iếm khác (ví dụ, tơ b óng mờ, xem phần ó), ta để draw p olygon ch i hàm tơng ứng V iệc giúp ta đ ọc d ễ nhanh m tránh đợc nhiều phân nhanh điểu kiện Cắc xén ba c h ié u da giác Đ ố i với việc cát xén ba chiều, lại lán việc toạ đ ộ cá c đình củ a đa giác đ ợc biến d ổ i thơng qua phép biến đổi tuvèn tính (21) quan trọng Các đ iểm nhìn thấy đ ọ c c ó g iá trị z thồ măn - l < z < I , d ó cá c điểm năm nứa không gian cám có g iá trị z ihồ năm z < -1 Tất nhiên, trình Clip 3d - polygon ( ) tơng Chi cắt xén ba chiểu thực cần thiết liu lự nh trình clip - p o ly g o n { ) ta đo: clip - p o ly g o n = clip 3d - polygon; V í dụ, ta vẽ biêu đồ mật đ ối tợng k h u g đợc cát xén xén ba chiều lừng mật pliài tốn nhiều thời gian Bood clip3d - polviỉon (nO, p olvo, n, poly) short * n0; Kích cữ cù a da giác cuối cù n g * ỉ 64 ( I Pro to h) việc cắt V ecto r poỉvO [],;'* Đ a giac cuòi cùng.-“/ short n: / * s ị c ủ a dính */ float p o lv []; / * Maii'j Vector */ {/* Bãt đãu c i i p i d - polygon '61 s t a t i c f l o a t a d d i t i o n a l ¡.12 - ' “ O d i e m c ộ n g i c o n t ; o ::V registcp char ■' re s' = Ren; c h * h i - r e g = rcg + II, cad e; r e g is te r s h o r t X, v; float 2; register float * p = poly, * q; short i ; float **r; float ** p p o lv ; / * chi T m p l T m p * / float * * pp :i:*h i - pp; /* Các trò thành ppo!y[] */ short cu t - o f f = 0; for (; reg (hi - reg; reg ++, p+ = D im ) { point - region (* rcg, p); if (* reg ! = ) + + cut - pff; ] /* Kct Ihue lor (rcg) *! * l e g = rcg [0]; Ì (cu t - o f f = = return F A L S E ; e l s e Ì ( c u t - o i f = = n, I / * Đ a i ; i c c ó I h e n ằ m MSỉồi h ì n h h ộ p */' f o r (i = ; I < : i + + ) ị 65 co d e = clip - IC2 [ij for (TC2 = I\C£; reu < 111 - res, rcg ++) if (! ( * re*: co d e) I bccak; if (rcg = = hi - rcii ) I / * Đ a s iá c nằm ncoài họp : *n0 = return TR UE: ) /* Kếl thúc if (reg) */ } /* Kốt thúc l'or (i; * / } /* Kết Ihtic if (cut - off) * / p = p o l y ; Ii0 = n; /* Gán tro ch o đỉnh cửa đa giác * / hi - pp = (pp = p p oly = T m p l ) + n; for (; pp Chi - pp; pp ++, p + = D im ) *pp = p; add = addition!; for (i = 5: i > i - ) { co d e = C lip - reg [i]: for Chi - r e s = (res = R eg) + *n0; r e s < re + + ) i f (* r e s ¿ cade, break: if ( r e g < hi - resj ( hi - pp = vpp = ppiy >- *n0; * h i - pp = * pp; r = pnolv = (.ppoiv = = Tm plV Tm p2 : T m p lj: res: = Reg: w h ile I pp < h i - pp ) j 66 p = * pp ++; q = *pp; i f ( * reg + + & cod e) { i f ( ! ( * rcg & codc )) { * r + + = add; intpol ( add Ị), q, i); aclci + = Dim; } c le s { * r + + = p; if (* reg & c o đ c ) { aitpol (add, p, q, i;; add + = Dim } / * K ết thúc i f ( * reg & co d c */ } / * K ết thúc if (* reg ) * / }/* Kết thúc vvhile (pp ) */ pp = ppoly; i f ( i > { / * X c định cù a vùng đợc thay đổi * / for (reg = R e g ; pp < r, reg ++, pp + + { p = *pp Point - region ( * reg, p); * rcg = R e g [0]; } / * Kết thúc ( i ) */ nO = r - ppoly; i f ( * nO < 3) { 67 * no = 0; return T R U E ; } / * K ết thúc i f (* nO) * / } / * Kết thúc i f (le g ) * / } / * K ết thúc for (i) * / / * Bây g iờ s a o m ọ i thứ s a n g poly */ p = * p oly ); hi - pp = ( p p = ppoly ) + * nO; for ( ; pp < hi - pp; pp + + , p+ = D im ) Copy - v ec (p, * pp; return T R U E ; } /* K ết thúc clip3cl - p o lvg on ( ) */ H ình 11 V iệ c cắt xén chiều tiến hành trẽn toạ đ ộ k h ô n g gian (bên trái) h o ặc c ó thể đ ợc ứng d u n s ch o p h ò n s đ ợ c biến đổi c h o phép tuyến lính (bên phải) T ron g trịng hợp sau, hình chiếu trực g ia o so n g s o n g hình cụi quan sát hình hộp H ình 11 c h o biết cách iluíc cất xén ba chiều: bên trái, ch óp quan sát đ ợ c sứ d ụng để cắt x é n ph ono, 0' bên phài, tồn phơng đợc biến đ ổ i th ô n g qua phép biến đổi tuyến tính T2 68 ... NỔI TRƯƠNG ĐAI HOC K H O A H Ọ C T ự NHIÊN .Q ~ GSORG GLAESER THUẬT T O Á N NHANH ÁP DỤNG Đơì VỚI ĐỒ THỊ 30 ■ ■ VỚI 94 HÌNH MINH HOẠ Springer - werlaeg New Jorlin Heidelberg lendon pars Jokyo... NỘI HU'ÒN

Ngày đăng: 18/03/2021, 19:04

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w