Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 70 trang
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