Giáo trình Đồ họa máy tính I: Phần 2

91 59 0
Giáo trình Đồ họa máy tính I: Phần 2

Đ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

Nối tiếp phần 1, phần 2 của giáo trình Đồ họa máy tính I tiếp tục trình bày các nội dung chính sau: Giao của các đối tượng, giao của đoạn thẳng và đa giác lồi, giao hai đa giác, vùng định nghĩa bởi pixel, thuật toán tô màu đa giác. Mời các bạn cùng tham khảo để nắm nội dung chi tiết.

Chu.o.ng Giao cu˙’a c´ ac d ¯ˆ o´i tu.o ng 3.1 `au Mo˙’ d ¯ˆ `an giao Mˆo.t nh˜ u.ng b`ai to´an quan tro.ng cu˙’a d¯`ˆo ho.a m´ay t´ınh l`a x´ac d¯i.nh d¯u.o c phˆ (c`on go.i l`a cˇa´t x´en) c´ac nguyˆen so.: giao d¯iˆe˙’m cu˙’a hai d¯oa.n thˇa˙’ng, giao cu˙’a d¯u.`o.ng thˇa˙’ng `oi Vˆa´n d¯`ˆe o˙’ d¯aˆy l`a x´ac d¯i.nh c´ac d¯oˆ´i tu.o ng c´o giao v´o.i d¯u.`o.ng tr`on hay d¯a d¯a gi´ac lˆ khˆong? Nˆe´u c´o th`ı t`ım giao cu˙’a ch´ ung `an thu c hiˆe.n nhanh nhˆa´t c´o thˆe˙’ d¯u.o c Nhu d¯˜a d¯`ˆe cˆa.p Chu.o.ng 1, c´ac thuˆa.t to´an cˆ ´.ng du.ng Ch´ ung d¯ˆe˙’ cung cˆa´p ngu.`o.i su˙’ du.ng cˆa.p nhˆa.t nhanh c´ac kˆe´t qua˙’ thay d¯oˆ˙’i u ta s˜e ´ap du.ng c´ac phu.o.ng ph´ap gia˙’i t´ıch d¯ˆe˙’ gia˙’i quyˆe´t c´ac b`ai to´an chu.o.ng n`ay 3.2 Giao cu˙’ a hai d ¯oa.n thˇ a˙’ ng - ˆay Mˆo.t b`ai to´an thˆong du.ng d¯`oˆ ho.a m´ay t´ınh l`a x´ac d¯i.nh giao cu˙’a hai d¯oa.n thˇa˙’ng D `an quyˆe´t d¯.inh cu˙’a nh˜ l`a mˆo.t phˆ u.ng thuˆa.t to´an t`ım giao (chˇa˙’ng ha.n, giao hai d¯a gi´ac) v`a `eu tiˆe´n tr`ınh kh´ac Phˆ `an n`ay ´ap du.ng viˆe.c tham sˆo´ ho´a cu˙’a d¯oa.n thˇa˙’ng xuˆa´t hiˆe.n nhiˆ d¯ˆe˙’ gia˙’i quyˆe´t b`ai to´an sau B` to´ an Trong mˇa.t phˇa˙’ng cho hai d¯oa.n thˇa˙’ng AB v`a CD X´ac d¯.inh giao d¯iˆe˙’m cu˙’a ch´ ung nˆe´u c´o 83 D A B D A C C C A A s B Cs D B B s D s H`ınh 3.1: C´ac tru.`o.ng ho p v´o.i hai d¯oa.n thˇa˙’ng 3.2.1 Phˆ an t´ıch `eu tru.`o.ng ho p xa˙’y v´o.i hai d¯oa.n thˇa˙’ng nhu H`ınh 3.1: Ch´ C´o nhiˆ ung c´o thˆe˙’ khˆong `an lˆen giao nhau, c´o thˆe˙’ cˇa´t ta.i mˆo.t d¯iˆe˙’m hoˇa.c phu˙’ lˆa´p mˆo.t phˆ X´et c´ac phu.o.ng tr`ınh tham sˆo´ tu.o.ng u ´.ng hai d¯oa.n thˇa˙’ng AB v`a CD l`a P (t) := A + t(B − A), t ∈ [0, 1], Q(u) := C + u(D − C) u ∈ [0, 1] v`a Viˆe.c su˙’ du.ng c´ac tham sˆo´ kh´ac v´o.i hai d¯oa.n thˇa˙’ng d¯ˆe˙’ biˆe˙’u diˆ˜en c´ac d¯iˆe˙’m kh´ac trˆen hai d¯oa.n mˆo.t c´ach d¯oˆ c lˆa.p K´ y hiˆe.u l1 v`a l2 l`a c´ac d¯u.`o.ng thˇa˙’ng d¯i qua A, B v`a C, D tu.o.ng u ´.ng Phu.o.ng ph´ap o˙’ d¯ˆay tru.´o.c hˆe´t l`a t`ım giao d¯iˆe˙’m cu˙’a hai d¯u.`o.ng thˇa˙’ng l1 v`a l2 (nˆe´u c´o) v`a sau d¯o´ x´ac d¯i.nh giao d¯iˆe˙’m c´o nˇa` m trˆen hai d¯oa.n thˇa˙’ng hay khˆong Trong tru.`o.ng ho p hai d¯u.`o.ng thˇa˙’ng giao - iˆ `an x´ac d¯.inh c´ac tham sˆo´ t0 v`a u0 cho P (t0 ) = Q(u0 ) D `eu kiˆe.n n`ay chı˙’ nhau, ta cˆ xA + (xB − xA )t0 = xC + (xD − xC )u0 , (3.1) yA + (yB − yA )t0 = yC + (yD − yC )u0 (3.2) Suy d × t0 = d , 84 d¯´o d := v`a d := xB − xA yB − yA xD − xC yD − yC xC − xA yC − yA xD − xC yD − yC , C´o hai tru.`o.ng ho p ch´ınh xa˙’y tu` y theo d bˇ`a ng khˆong hay khˆong d kh´ ac khˆ ong `on ta.i nhˆa´t tham sˆo´ t0 = dd Nˆe´u t0 khˆong thuˆo.c d¯oa.n [0, 1] th`ı Trong tru.`o.ng ho p n`ay, tˆ kˆe´t luˆa.n hai d¯oa.n thˇa˙’ng AB v`a CD khˆong giao nhau; ngu.o c la.i x´ac d¯i.nh tham sˆo´ u0 t` u Phu.o.ng tr`ınh (3.1) hoˇa.c (3.2) Nˆe´u u0 thuˆo.c d¯oa.n [0, 1] th`ı hai d¯oa.n thˇa˙’ng giao v`a to.a d¯oˆ d¯iˆe˙’m giao c´o thˆe˙’ x´ac d¯.inh bo˙’.i P (t0 ) = Q(u0 ) ` d bˇ a ng khˆ ong Nˆe´u d = th`ı hai d¯u.`o.ng thˇa˙’ng l1 v`a l2 song song hoˇa.c tr` ung C´ac d¯oa.n thˇa˙’ng c´o thˆe˙’ - ˆe˙’ `eu n`ay chı˙’ c´o thˆe˙’ xa˙’y hai d¯u.`o.ng thˇa˙’ng tr` phu˙’ lˆa´p lˆen nhu ng d¯iˆ ung D `eu d¯´o, ta chı˙’ cˆ `an x´ac d¯.inh d¯iˆe˙’m C c´o nˇ`a m trˆen d¯u.`o.ng thˇa˙’ng l1 d¯i qua hai d¯iˆe˙’m kiˆe˙’m tra d¯iˆ A v`a B khˆong Ta c´o C thuˆo.c l1 nˆe´u to.a d¯oˆ cu˙’a n´o thoa˙’ m˜an d (xC , yC ) = 0, d¯o´ d (x, y) := x − xA y − yA xB − xA yB − yA Trong tru.`o.ng ho p ngu.o c la.i, hai d¯u.`o.ng thˇa˙’ng l1 v`a l2 song song v`a khˆong tr` ung nhau; suy hai d¯oa.n thˇa˙’ng khˆong giao Do d¯´o tiˆe´n tr`ınh cuˆo´i c` ung l`a kiˆe˙’m tra hai d¯oa.n thˇa˙’ng c´o phu˙’ lˆa´p lˆen khˆong - ˆe˙’ thu c hiˆe.n d¯iˆ `eu n`ay, ta cˆ `an x´ac d¯.inh hai tham sˆo´ thu c tC v`a tD cho C = P (tC ) D `an x´et phu.o.ng tr`ınh theo x (nˆe´u l1 v`a D = P (tD ) V`ı hai d¯u.`o.ng thˇa˙’ng tr` ung nˆen chı˙’ cˆ khˆong song song v´o.i tru.c tung; ngu.o c la.i su˙’ du.ng phu.o.ng tr`ınh theo y) Dˆ˜e d`ang kiˆe˙’m tra rˇ`a ng xC − xA tC = , xB − xA v`a tD = xD − xA xB − xA 85 - oa.n thˇa˙’ng AB bˇa´t d¯`aˆu v`a kˆe´t th´ D uc tu.o.ng u ´.ng ta.i t = v`a t = v`a bˇ`a ng c´ach kiˆe˙’m tra th´ u tu cu˙’a bˆo´n tham sˆo´ 0, 1, tC v`a tD ch´ ung ta c´o thˆe˙’ x´ac d¯.inh d¯u.o c vi tr´ı tu.o.ng d¯oˆ´i `on ta.i phˆ `an chung gi˜ u ca˙’ hai tham sˆo´ tC v`a tD c` ung cu˙’a hai d¯oa.n thˇa˙’ng Tˆ u.a hai d¯oa.n tr` nho˙’ ho.n hoˇa.c l´o.n ho.n Trong tru.`o.ng ho p c´o d¯oa.n chung, c´ac d¯iˆe˙’m d¯`ˆau cuˆo´i c´o thˆe˙’ dˆ˜e d`ang x´ac d¯i.nh t` u c´ac gi´a tri tC v`a tD 3.2.2 Thuˆ a.t to´ an x´ ac d ¯i.nh giao hai d ¯oa.n thˇ a˙’ ng - `ˆau Trˆen co so˙’ cu˙’a nh˜ u.ng tha˙’o luˆa.n trˆen ta c´o thˆe˙’ viˆe´t la.i thuˆa.t to´an chi tiˆe´t nhu sau D `om bˆo´n d¯iˆe˙’m A, B, C v`a D; d¯`aˆu gˆ `om giao d¯iˆe˙’m I (nˆe´u c´o) v`a biˆe´n Kind nhˆa.n mˆo.t v`ao gˆ `on ta.i d¯iˆe˙’m giao, tˆ `on ta.i mˆo.t d¯iˆe˙’m giao I hoˇa.c ba gi´a tri 0, hoˇa.c tu` y theo khˆong tˆ `an hai d¯oa.n phu˙’ lˆa´p lˆen mˆo.t phˆ Kho˙’.i ta.o Kind = T´ınh d Nˆe´u d = (t´ u.c l`a c´ac d¯oa.n thˇa˙’ng khˆong song song) thu c hiˆe.n • T´ınh t0 Nˆe´u t0 ∈ [0, 1] th`ı d` u.ng, hai d¯oa.n thˇa˙’ng khˆong giao u.ng, hai d¯oa.n thˇa˙’ng khˆong giao • T´ınh u0 Nˆe´u u0 ∈ [0, 1] th`ı d` • Ngu.o c la.i, kˆe´t luˆa.n Kind = v`a hai d¯oa.n thˇa˙’ng giao ta.i I = A + t0 (B − A) = C + u0 (D − C) Ngu.o c la.i (c´ac d¯oa.n thˇa˙’ng song song) v`a nˆe´u d¯iˆe˙’m C nˇ`a m trˆen d¯u.`o.ng thˇa˙’ng AB • X´ac d¯i.nh tC v`a tD • Nˆe´u ca˙’ hai tC v`a tD c` ung nho˙’ ho.n hoˇa.c c` ung l´o.n ho.n th`ı hai d¯oa.n thˇa˙’ng khˆong giao Ngu.o c la.i, d¯ˇa.t Kind = 2; giao hai d¯oa.n thˇa˙’ng l`a mˆo.t d¯oa.n thˇa˙’ng (t`ım hai d¯`aˆu m´ ut?) V´ı du 3.2.1 (a) Gia˙’ su˙’ A(1, 4), B(7, 6), C(4, 8) v`a D(7, 9) Ta c´o d= xB − xA yB − yA xD − xC yD − yC = = - ˆe˙’ kˆe´t luˆa.n, thay to.a d¯oˆ Suy hai d¯u.`o.ng thˇa˙’ng AB v`a CD song song hoˇa.c tr` ung D d¯iˆe˙’m C v`ao phu.o.ng tr`ınh d (x, y) ta d¯u.o c d (xC , yC ) = xC − xA yC − yA xB − xA yB − yA 86 = = −18 = Vˆa.y AB ∩ CD = ∅ (b) Gia˙’ su˙’ A(1, 3), B(10, 6), C(4, 7) v`a D(13, 1) Ta c´o d= xB − xA yB − yA xD − xC yD − yC = 9 −6 = −81 = Suy hai d¯u.`o.ng thˇa˙’ng AB v`a CD cˇa´t ta.i I T` u d = c´o t0 = d d = xC − xA yC − yA xD − xC yD − yC = −6 = −54, ∈ [0, 1] Gia˙’i u0 theo Phu.o.ng tr`ınh (3.1) ta d¯u.o c u0 = −3 + 32 (xA − xC ) + (xB − xA )t0 = = ∈ [0, 1] xD − xC Vˆa.y hai d¯oa.n thˇa˙’ng AB v`a CD giao ta.i I = A + t0 (B − A) = (1, 3) + (9, 3) = (7, 5) 3.3 - oa.n thˇ D a˙’ ng v` a h`ınh ch˜ u nhˆ a.t `an n`ay ch´ Trong phˆ ung ta t`ım hiˆe˙’u mˆo.t sˆo´ thuˆa.t to´an x´ac d¯.inh giao cu˙’a d¯oa.n thˇa˙’ng v`a h`ınh ch˜ u nhˆa.t (R) (c´o c´ac ca.nh song song v´o.i c´ac tru.c to.a d¯ˆo.) H`ınh 3.2 chı˙’ bˆo´n tru.`o.ng ho p c´o thˆe˙’: • Ca˙’ hai d¯iˆe˙’m d¯`aˆu cuˆo´i cu˙’a d¯oa.n thˇa˙’ng, chˇa˙’ng ha.n AB, nˇ`a m ho`an to`an h`ınh ch˜ u `an giao ch´ınh l`a d¯oa.n thˇa˙’ng n`ay nhˆa.t Hiˆe˙’n nhiˆen d¯o´ phˆ • Mˆo.t hai d¯`ˆau m´ ut cu˙’a d¯oa.n thˇa˙’ng, chˇa˙’ng ha.n BC, nˇ`a m h`ınh ch˜ u nhˆa.t • Ca˙’ hai d¯iˆe˙’m d¯`aˆu cuˆo´i cu˙’a d¯oa.n thˇa˙’ng, chˇa˙’ng ha.n CD, nˇ`a m ngo`ai h`ınh ch˜ u nhˆa.t nhu.ng c´o giao kh´ac trˆo´ng v´o.i h`ınh ch˜ u nhˆa.t `e “nu˙’.a mˇa.t • Ca˙’ hai d¯iˆe˙’m d¯`ˆau cuˆo´i cu˙’a d¯oa.n thˇa˙’ng (chˇa˙’ng ha.n DE) nˇ`a m ho`an to`an vˆ `an giao phˇa˙’ng ngo`ai” x´ac d¯i.nh bo˙’.i mˆo.t ca.nh (bˆen tr´ai) cu˙’a h`ınh ch˜ u nhˆa.t Ta c´o phˆ bˇ`a ng trˆo´ng T`ınh huˆo´ng n`ay thu.`o.ng xa˙’y h`ınh ch˜ u nhˆa.t d¯u˙’ nho˙’ v`a d¯´o c´o `eu d¯oa.n nˇ`a m ngo`ai h`ınh ch˜ nhiˆ u nhˆa.t 87 C B D E H`ınh ch˜ u nhˆa.t (R) A H`ınh 3.2: C´ac d¯oa.n thˇa˙’ng v`a h`ınh ch˜ u nhˆa.t (R) C • ymax — • A B • • D ymin — | xmin xmax H`ınh 3.3: C´ac tru.`o.ng ho p chˆa´p nhˆa.n hoˇa.c loa.i bo˙’ cu˙’a mˆo.t d¯oa.n thˇa˙’ng H˜ay quan s´at vi tr´ı tu.o.ng d¯oˆ´i cu˙’a d¯oa.n thˇa˙’ng v`a h`ınh ch˜ u nhˆa.t (R), ch´ ung ta s˜e thˆa´y - oa.n thˇa˙’ng c´o thˆe˙’ nˇ`a m bˆen `eu t`ınh huˆo´ng c´o thˆe˙’ xa˙’y m`a thuˆa.t to´an pha˙’i xu˙’ l´ y D c´o nhiˆ tr´ai, bˆen pha˙’i, ph´ıa du.´o.i hay ph´ıa trˆen cu˙’a h`ınh ch˜ u nhˆa.t Hoˇa.c n´o c´o thˆe˙’ cˇa´t bˆa´t k` y mˆo.t `eu (hay hai) ca.nh h`ınh ch˜ u nhˆa.t, v`a vˆan vˆan T´om la.i vˆa´n d¯`ˆe c´o ve˙’ rˇa´c rˆo´i v`ı c´o thˆe˙’ c´o nhiˆ `an mˆo.t c´ach tˆo˙’ ch´ kha˙’ nˇang kh´ac c´o thˆe˙’ xa˙’y Do d¯o´ ch´ ung ta cˆ u.c v`a tiˆe´p cˆa.n hiˆe.u qua˙’ gia˙’i quyˆe´t b`ai to´an tru.`o.ng ho p tˆo˙’ng qu´at v`a t´ınh to´an c´ac d¯iˆe˙’m d¯`ˆau cuˆo´i m´o.i `an giao T´ınh hiˆe.u qua˙’ d¯aˇ c biˆe.t quan tro.ng c´o thˆe˙’ c´o h`ang trˇam, thˆa.m ch´ı h`ang cu˙’a phˆ `an loa.i bo˙’ phˆ `an nˇa` m ngo`ai h`ınh ch˜ ng`an, d¯oa.n thˇa˙’ng mˆo.t h`ınh v`a mˆo˜i d¯oa.n cˆ u nhˆa.t `an n`ay tr`ınh b`ay mˆo.t sˆo´ thuˆa.t to´an t`ım giao cu˙’a d¯oa.n thˇa˙’ng v`a h`ınh ch˜ Phˆ u nhˆa.t `am thu.`o.ng (xem H`ınh 3.3) c´o thˆe˙’ xa˙’y ra: Tru.´o.c hˆe´t nhˆa.n x´et rˇa` ng c´o hai tru.`o.ng ho p tˆ `am thu.`o.ng d¯`ˆau tiˆen, go.i l`a chˆa´p nhˆa.n, l`a hai d¯iˆe˙’m d¯`aˆu cuˆo´i d¯oa.n thˇa˙’ng Tru.`o.ng ho p tˆ 88 ch´ u.a h`ınh ch˜ u nhˆa.t `am thu.`o.ng th´ Tru.`o.ng ho p tˆ u hai, go.i l`a loa.i bo˙’, ca˙’ hai d¯iˆe˙’m d¯`aˆu cuˆo´i cu˙’a d¯oa.n thˇa˙’ng `e nu˙’.a mˇa.t phˇa˙’ng ngo`ai x´ac d¯i.nh bo˙’.i mˆo.t ca.nh cu˙’a h`ınh ch˜ u nhˆa.t nˇ`a m ho`an to`an vˆ 3.3.1 ` T`ım giao bˇ a ng c´ ach gia˙’ i hˆ e c´ ac phu.o.ng tr`ınh C´ach tiˆe´p cˆa.n ch´ınh tru.`o.ng ho p A v`a B khˆong d¯`oˆng th`o.i nˇa` m (R) l`a kiˆe˙’m tra d¯oa.n thˇa˙’ng AB c´o giao v´o.i c´ac ca.nh cu˙’a h`ınh ch˜ u nhˆa.t khˆong; nˆe´u c´o, x´ac d¯.inh c´ac giao `an giao Do d¯´o d¯u.a vˆ `e b`ai to´an x´ac d¯.inh giao cu˙’a hai d¯oa.n thˇa˙’ng v`a c´o d¯iˆe˙’m v`a suy phˆ `an 3.2 Theo phu.o.ng ph´ap n`ay, ch´ `an t´ınh to´an thˆe˙’ ´ap du.ng nh˜ u.ng kˆe´t qua˙’ Phˆ ung ta cˆ `eu kha˙’ nˇang; d¯o´ khˆong hiˆe.u qua˙’ v`a kiˆe˙’m tra nhiˆ 3.3.2 Thuˆ a.t to´ an chia nhi phˆ an ´ ch´ınh cu˙’a thuˆa.t to´an n`ay tu.o.ng tu thuˆa.t to´an t`ım nghiˆe.m cu˙’a phu.o.ng tr`ınh f (x) = Y trˆen d¯oa.n [a, b] v´o.i f liˆen tu.c v`a f (a)f (b) < bˇa` ng phu.o.ng ph´ap chia nhi phˆan (bisection): X´ac d¯i.nh c´ac giao d¯iˆe˙’m (nˆe´u c´o) cu˙’a d¯oa.n thˇa˙’ng AB v`a h`ınh ch˜ u nhˆa.t bˇ`a ng phu.o.ng ph´ap chia nhi phˆan Thuˆa.t to´an tru.´o.c hˆe´t kiˆe˙’m tra hai tru.`o.ng ho p chˆa´p nhˆa.n v`a loa.i bo˙’ Nˆe´u khˆong xa˙’y `an bˇ`a ng v`a loa.i bo˙’ nh˜ `an nˇ`a m ngo`ai h`ınh ra, n´o chia d¯oa.n thˇa˙’ng th`anh hai phˆ u.ng phˆ `an c`on la.i d¯u.o c xu˙’ l´ y lˇa.p la.i bˇ`a ng c´ach kiˆe˙’m tra c´ac Tru.`o.ng ho p v`a ch˜ u nhˆa.t Sau d¯o´ phˆ `an) cho d¯ˆe´n phˆ `an c`on la.i ho`an to`an nˇ`a m h`ınh ch˜ v`a tiˆe´p tu.c phˆan chia (nˆe´u cˆ u nhˆa.t hoˇa.c nˇ`a m nu˙’.a mˇa.t phˇa˙’ng ngo`ai x´ac d¯.inh bo˙’.i mˆo.t d¯u.`o.ng thˇa˙’ng bˆen tr´ai, bˆen pha˙’i, bˆen du.´o.i hoˇa.c bˆen trˆen n`ao d¯o´ - ˆe˙’ x´ac d¯.inh c´ac d¯iˆe˙’m d¯`ˆau cuˆo´i n`ao nˇa` m ngo`ai hay mˆo.t h`ınh ch˜ D u nhˆa.t, ch´ ung ta d¯ˇa.t mˆo.t m˜a “nu˙’ a mˇa.t phˇa˙’ng” cho mˆo˜i d¯iˆe˙’m Mˆo˜i ca.nh cu˙’a h`ınh ch˜ u nhˆa.t x´ac d¯i.nh mˆo.t d¯u.`o.ng thˇa˙’ng d¯i qua n´o; d¯u.`o.ng thˇa˙’ng n`ay chia mˇa.t phˇa˙’ng th`anh nu˙’.a mˇa.t phˇa˙’ng v`a nu˙’.a mˇa.t phˇa˙’ng ngo`ai nhu H`ınh 3.4 d¯oˆ´i v´o.i ca.nh bˆen pha˙’i: Ta quy u.´o.c nu˙’.a mˇa.t phˇa˙’ng tu.o.ng u ´.ng ch´ u.a h`ınh ch˜ u nhˆa.t; ngu.o c la.i l`a nu˙’.a mˇa.t phˇa˙’ng ngo`ai Do c´o bˆo´n ca.nh, ta s˜e su˙’ du.ng chuˆo˜i bˆo´n bit d¯ˆe˙’ m˜a ho´a mˆo.t d¯iˆe˙’m P mˇa.t phˇa˙’ng K´ y hiˆe.u E(P ) l`a m˜a cu˙’a d¯iˆe˙’m P Mˆo˜i bit t` u m˜a d¯u.o c d¯aˇ t bˇ`a ng (TRUE) hoˇa.c `eu kiˆe.n sau: (FALSE); bˆo´n bit t` u m˜a E(P ) tu.o.ng u ´.ng c´ac d¯iˆ 89 (R) Nu˙’.a mˇa.t phˇa˙’ng ngo`ai Nu˙’.a mˇa.t phˇa˙’ng xmax H`ınh 3.4: C´ac nu˙’.a mˇa.t phˇa˙’ng d¯u.o c x´ac d¯.inh bo˙’.i ca.nh bˆen pha˙’i • Bit th´ u nhˆa´t d¯ˇa.t bˇ`a ng nˆe´u d¯iˆe˙’m P thuˆo.c nu˙’.a mˇa.t phˇa˙’ng ngo`ai x´ac d¯i.nh bo˙’.i ca.nh bˆen tr´ai; • Bit th´ u hai d¯aˇ t bˇ`a ng nˆe´u d¯iˆe˙’m P thuˆo.c nu˙’.a mˇa.t phˇa˙’ng ngo`ai x´ac d¯i.nh bo˙’.i ca.nh bˆen pha˙’i; • Bit th´ u ba d¯aˇ t bˇ`a ng nˆe´u d¯iˆe˙’m P thuˆo.c nu˙’.a mˇa.t phˇa˙’ng ngo`ai x´ac d¯i.nh bo˙’.i ca.nh bˆen trˆen; u tu d¯aˇ t bˇa` ng nˆe´u d¯iˆe˙’m P thuˆo.c nu˙’.a mˇa.t phˇa˙’ng ngo`ai x´ac d¯.inh bo˙’.i ca.nh bˆen • Bit th´ du.´o.i Do d¯´o c´ac d¯iˆe˙’m nˇ`a m h`ınh ch˜ u nhˆa.t c´o m˜a 0000; c´ac d¯iˆe˙’m thuˆo.c v` ung nˇa` m ph´ıa trˆen v`a bˆen tr´ai h`ınh ch˜ u nhˆa.t d¯u.o c g´an t` u m˜a l`a 1001 Viˆe.c xˆay du ng m˜a cu˙’a mˆo.t d¯iˆe˙’m `an l`a bˆo´n ph´ep so s´anh: Ho`anh d¯oˆ cu˙’a d¯iˆe˙’m d¯u.o c so s´anh v´o.i ca.nh bˆen tr´ai xmin ; d¯o.n thuˆ tung d¯oˆ d¯u.o c so s´anh v´o.i ca.nh bˆen du.´o.i ymin ; v.v C´ac d¯u.`o.ng thˇa˙’ng d¯i qua c´ac ca.nh cu˙’a h`ınh ch˜ u nhˆa.t chia mˇa.t phˇa˙’ng th`anh ch´ın v` ung C´ac d¯iˆe˙’m mˆo.t v` ung c´o c` ung mˆo.t m˜a nhu chı˙’ H`ınh 3.5 V`ı d¯o n vi nho˙’ nhˆa´t c´o thˆe˙’ d¯o.c, ghi trˆen m´ay t´ınh l`a byte, nˆen ch´ ung ta su˙’ du.ng kiˆe˙’u byte d¯ˆe˙’ m˜a ho´a mˆo.t d¯iˆe˙’m d¯´o bˆo´n bit thˆa´p tu.o.ng u ´.ng t` u m˜a cu˙’a n´o v`a bˆo´n bit cao d¯u.o c d¯aˇ t bˇ`a ng khˆong Thu˙’ tu.c Encode() thu c hiˆe.n tiˆe´n tr`ınh n`ay: void Encode(Point2D P, float Left, float Right, float Bottom, float Top, char *Code) { 90 ymax ymin 1001 0001 1000 0000 1010 0010 xmin 0101 0100 0110 xmax ´.ng h`ınh ch˜ u nhˆa.t (R) H`ınh 3.5: C´ac t` u m˜a tu.o.ng u *Code = 0; if (P.x < Left) *Code |= 8; if (P.x > Right) *Code |= 4; if (P.y < Bottom) *Code |= 2; if (P.y > Top) *Code |= 1; } ung ta C´ac d¯iˆe˙’m A, B d¯u.o c m˜a ho´a th`anh c´ac t` u m˜a E(A) v`a E(B) Trˆen co so˙’ d¯´o ch´ c´o thˆe˙’ x´ac d¯.inh d¯oa.n thˇa˙’ng AB nˇ`a m ho`an to`an bˆen h`ınh ch˜ u nhˆa.t hoˇa.c thuˆo.c nu˙’.a mˇa.t phˇa˙’ng ngo`ai n`ao d¯´o Ta c´o Chˆa´p nhˆa.n nˆe´u v`a chı˙’ nˆe´u E(A) = E(B) = Loa.i bo˙’ nˆe´u v`a chı˙’ nˆe´u [E(A) AND E(B)] != Trˆen co so˙’ cu˙’a nh˜ u.ng phˆan t´ıch trˆen ta c´o thˆe˙’ viˆe´t la.i thuˆa.t to´an chia nhi phˆan nhu sau: Nˆe´u E(A) = v`a E(B) = kˆe´t luˆa.n AB ∩ (R) = AB; thuˆa.t to´an d` u.ng Nˆe´u [E(A) AND E(B)] != kˆe´t luˆa.n AB ∩ (R) = ∅; kˆe´t th´ uc thuˆa.t to´an 91 Nˆe´u E(A) = v`a E(B) = (t´ u.c A ∈ (R) v`a B ∈ / (R)) thu c hiˆe.n - ˇa.t C = A, D = B • D • Trong d¯ˆo d`ai CD l´o.n ho.n (sˆo´ du.o.ng nho˙’ t` uy y ´) - ˇa.t M l`a trung d¯iˆe˙’m cu˙’a d¯oa.n CD D Nˆe´u E(M ) = th`ı cˆa.p nhˆa.t C = M ngu.o c la.i D = M • Kˆe´t luˆa.n AB ∩ (R) = AM ; kˆe´t th´ uc thuˆa.t to´an Nˆe´u E(A) = v`a E(B) = (t´ u.c A ∈ / (R) v`a B ∈ (R)), ho´an d¯oˆ˙’i vai tr`o cu˙’a A v`a B; lˇa.p la.i Bu.´o.c Ngu.o c la.i thu c hiˆe.n - ˇa.t C = A, D = B • D • Trong d¯ˆo d`ai CD l´o.n ho.n - ˇa.t M l`a trung d¯iˆe˙’m cu˙’a d¯oa.n CD D Nˆe´u E(M ) = ´ap du.ng Bu.´o.c cho hai d¯oa.n M C v`a M D Kˆe´t luˆa.n AB ∩(R) = CD; kˆe´t th´ uc thuˆa.t to´an Nˆe´u [E(M ) AND E(C)] != d¯aˇ t C = M Nˆe´u [E(M ) AND E(D)] != d¯ˇa.t D = M Nˆe´u [E(C) AND E(D)] != kˆe´t luˆa.n AB ∩ (R) = ∅; kˆe´t th´ uc thuˆa.t to´an y ymax — A• M1 3• M2M • • •B ymin — | xmin | xmax x H`ınh 3.6: Minh ho.a cu˙’a thuˆa.t to´an chia nhi phˆan u nhˆa.t V´ı du 3.3.1 X´et v´ı du t`ım giao cu˙’a h`ınh ch˜ R := {(x, y) ∈ R2 | ≤ x ≤ 7, ≤ y ≤ 5} 92 d¯ˆo u.u tiˆen cao ho.n s˜e d¯u.o c tˆo phu˙’ lˆen c´ac d¯a gi´ac c´o d¯ˆo u.u tiˆen thˆa´p ho.n Gia˙’ thiˆe´t rˇ`a ng tr`ınh u ´.ng du.ng d¯˜a cho tru.´o.c c´ac d¯oˆ u.u tiˆen kh´ac v´o.i mˆo˜i d¯a gi´ac2 `en xu˙’ l´ Tru.´o.c v˜e h`ınh, c´ac d¯a gi´ac d¯a˜ qua bu.´o.c tiˆ y v`a c´ac ca.nh cu˙’a ch´ ung d¯u.o c `an tru.´o.c lu.u c` ung mˆo.t ba˙’ng c´ac ca.nh t´ıch cu c ET Kiˆe˙’u d˜ u liˆe.u Edge Info phˆ d¯u.o c mo˙’ rˆo.ng d¯ˆe˙’ bao h`am thˆem hai tru.`o.ng m`au v`a d¯ˆo u.u tiˆen cu˙’a d¯a gi´ac: typedef struct EdgeNode2D *EdgePtr2D struct EdgePtr2D { int y_upper; float x_int; float Recip_Slope; int Priority; int Color; EdgePtr2D Next; }; `ong nhau: A, B v`a C v´o.i m`au v`a d¯oˆ u.u tiˆen tu.o.ng H`ınh 4.11 minh ho.a ba d¯a gi´ac chˆ u ´.ng l`a (GRAY, 6), (WHITE, 3) v`a (BLUE, 2) Danh s´ach d˜ u liˆe.u cu˙’a d`ong qu´et y = c lu.u `om thˆong tin cu˙’a nh˜ AEL Danh s´ach n`ay gˆ u.ng ca.nh c´o giao v´o.i d`ong qu´et y = c v`a d¯a˜ `an: x1 ≤ x2 ≤ ≤ x8 C´ac mˆa˙’u tin AEL tu.o.ng d¯u.o c sˇa´p xˆe´p theo ho`anh d¯ˆo tˇang dˆ - ˆe˙’ d¯o.n gia˙’n, u ´.ng mˆo.t giao d¯iˆe˙’m v`a ch´ u.a m`au v`a d¯oˆ u.u tiˆen cu˙’a d¯a gi´ac c´o ca.nh giao (D `an yupper v`a 1/m) Ngo`ai ra, ma˙’ng Covers[] c´o kiˆe˙’u Boolean ch´ ung ta bo˙’ qua c´ac th`anh phˆ `an tu˙’ cu˙’a ma˙’ng tu.o.ng u y tiˆe´n tr`ınh tˆo m`au, d¯o´ mˆo˜i phˆ ´.ng d¯u.o c su˙’ du.ng d¯ˆe˙’ qua˙’n l´ v´o.i mˆo.t d¯a gi´ac Khi x´et d`ong qu´et y = c, ma˙’ng n`ay cho biˆe´t thˆong tin cu˙’a nh˜ u.ng d¯a gi´ac ch´ u.a pixel hiˆe.n h`anh: Chˇa˙’ng ha.n, Covers[A] bˇ`a ng True nˆe´u ho`anh d¯oˆ x thuˆo.c d¯a gi´ac A v`a bˇ`a ng False nˆe´u ngu.o c la.i Biˆe´n N umCovers cho biˆe´t sˆo´ c´ac d¯a gi´ac ch´ u.a pixel hiˆe.n h`anh v`a biˆe´n V isP oly chı˙’ d¯ˆe´n d¯a gi´ac c´o d¯ˆo u.u tiˆen cao nhˆa´t ch´ u.a pixel hiˆe.n h`anh Ch´ ung ta tr`ınh b`ay thuˆa.t to´an thˆong qua v´ı du n`ay V´o.i d`ong qu´et y = c, kho˙’.i ta.o `an tu˙’ cu˙’a ma˙’ng Covers[] d¯u.o c g´an bˇa` ng False T` `an x = 0, N umCovers = v`a c´ac phˆ u phˆ - oa.n tu˙’ d¯`ˆau tiˆen AEL, ta c´o ho`anh d¯ˆo giao cu˙’a d`ong qu´et y = c v´o.i d¯a gi´ac n`ao d¯o´ D `en V`ı d`ong qu´et d¯i v`ao d¯a gi´ac B ta.i x = x1 nˆen Covers[B] g´an [0, x1 ] d¯u.o c tˆo bˇa` ng m`au nˆ bˇ`a ng True, N umCovers bˇ`a ng 1, v`a V isP oly chı˙’ d¯ˆe´n d¯a gi´ac B Su˙’ du.ng m`au cu˙’a d¯a gi´ac Trong mˆo.t sˆo´ tru.`o.ng ho p, d¯ˆo u.u tiˆen cu˙’a d¯a gi´ac d¯u.o c x´ac d¯.inh tu d¯ˆo.ng Nˆe´u, chˇa˙’ng ha.n c´ac d¯a gi´ac `eu th`ı d¯ˆo u.u tiˆen d¯u.o c d¯ˇa.t tu.o.ng th´ıch v´o.i khoa˙’ng l`a h`ınh chiˆe´u cu˙’a c´ac d¯a gi´ac khˆong gian ba chiˆ c´ach t` u vi tr´ı mˇa´t quan s´at d¯ˆe´n ch´ ung-xem [11] 159 y (C) y=c (B) (A) | | x1 | | | | | | x2 x3x4 x5 x6 x7 x8 x Con tro˙’ AEL • x1 NULL • x8 cB • x2 cA • x7 cA • x3 cC • x6 cB • x4 cA cA = GRAY, cB = WHITE, cC = BLUE `ong H`ınh 4.11: Tˆo m`au c´ac d¯a gi´ac chˆ 160 • x5 cC • cA B (l`a WHITE) d¯ˆe˙’ tˆo d¯oa.n t` u x1 d¯ˆe´n giao d¯iˆe˙’m kˆe´ tiˆe´p AEL Ta thˆa´y ta.i x2 , d`ong qu´et d¯i v`ao d¯a gi´ac A nˆen Covers[A] g´an bˇ`a ng True, N umCovers bˇa` ng Do d¯a gi´ac A c´o d¯ˆo u.u tiˆen cao ho.n cu˙’a B nˆen ta thay d¯ˆo˙’i m`au v˜e l`a GRAY (cu˙’a d¯a gi´ac A) v`a tˇa´t m`au cu˙’a B V`ı vˆa.y d¯oa.n [x1 , x2 ] s˜e d¯u.o c tˆo bˇa` ng m`au cu˙’a d¯a gi´ac B X´et tiˆe´p danh s´ach AEL, `eu n`ay chı˙’ ta.i x3 ta c´o giao d¯iˆe˙’m x3 thuˆo.c d¯a gi´ac B v`a Covers[B] bˇ`a ng True nˆen d¯iˆ ta kho˙’i d¯a gi´ac B Cˆa.p nhˆa.t Covers[B] v`a N umCovers Giao d¯iˆe˙’m x4 l`a d¯iˆe˙’m d¯i v`ao d¯a gi´ac C nhu.ng d¯ˆo u.u tiˆen cu˙’a n´o thˆa´p ho.n d¯ˆo u.u tiˆen d¯u.o c tro˙’ bo˙’.i biˆe´n V isP oly (l`a A) nˆen chı˙’ cˆa.p nhˆa.t Covers[C] v`a N umCovers v`a tiˆe´p tu.c Giao d¯iˆe˙’m x5 d¯´anh dˆa´u d¯iˆe˙’m cu˙’a d¯a gi´ac A Do d¯o´ thu c hiˆe.n tˆo m`au d¯oa.n [x2 , x5 ] v´o.i m`au cu˙’a A sau d¯o´ cˆa.p nhˆa.t y tu.o.ng tu v´o.i la.i Covers[A], N umCovers v`a V isP oly (tro˙’ d¯ˆe´n d¯a gi´ac C) Ba.n d¯o.c xu˙’ l´ `an c`on la.i cu˙’a d`ong qu´et nh˜ u.ng phˆ N´oi chung, thuˆa.t to´an xuˆa´t ph´at t` u d¯`ˆau danh s´ach AEL v`a thˆong qua mˆo.t d˜ay c´ac giao d¯iˆe˙’m d¯ˆe˙’ cˆa.p nhˆa.t ma˙’ng Covers[] v`a biˆe´n N umCovers Khi d¯a gi´ac c´o d¯oˆ u.u tiˆen l´o.n ho.n d¯oˆ u.u tiˆen cu˙’a d¯a gi´ac tro˙’ bo˙’.i V isP oly, thu c hiˆe.n tˆo m`au v`a d¯aˇ t la.i biˆe´n V isP oly Khi d¯i kho˙’i d¯a gi´ac kha˙’ kiˆe´n hiˆe.n h`anh, d` ung ma˙’ng Covers[] d¯ˆe˙’ x´ac d¯.inh d¯a gi´ac c´o d¯ˆo u.u tiˆen cao nhˆa´t phu˙’ pixel hiˆe.n h`anh; d¯oa.n hiˆe.n h`anh d¯u.o c tˆo m`au (v´o.i m`au n`ao?); v`a cˆa.p nhˆa.t la.i N umCovers v`a Covers[] 4.8 ˜u tˆ Tˆ o m` au theo mˆ a o `an tru.´o.c, ch´ Trong nh˜ u.ng phˆ ung ta tˆo m`au bˆen v` ung d¯i.nh ngh˜ıa bo˙’.i c´ac nguyˆen so v´o.i c´ac m`au d¯aˇ c (t´ u.c c´ac pixel v` ung c´o c` ung m`au) bˇa` ng c´ach go.i thu˙’ tu.c putpixel() v´o i gi´a tri m`au v˜e l`a V alue Du ´o i d¯aˆy ch´ ung ta kha˙’o s´at tˆo m`au v´o.i mˆa˜u tˆo cho tru.´o.c bˇ`a ng `eu khiˆe˙’n c´ac thuˆa.t to´an tˆo m`au V´o.i c´ac hˆe thˆo´ng d¯`oˆ ho.a c´ach thˆem c´ac d`ong lˆe.nh d¯iˆ `eu bit trˆen mˆo.t pixel, tiˆe´n tr`ınh d¯iˆ `eu khiˆe˙’n d¯aˇ t gi´a tri m`au d¯u.o c lˆa´y mˆo.t c´ach th´ıch c´o nhiˆ ho p mˆa˜u tˆo Tu.o.ng tu nhu kiˆe˙’u d´ang d¯oa.n thˇa˙’ng, d¯ˆe˙’ viˆe´t c´ac mˆa˜u tˆo bitmap dˆ˜e d`ang, ch´ ung ta go.i thu˙’ tu.c putpixel() v´o.i m`au nˆo˙’i tu.o.ng u ´.ng pixel c´o gi´a tri mˆo.t mˆa˜u v`a khˆong go.i thu˙’ tu.c n`ay nˆe´u pixel c´o gi´a tri Mˇa.t kh´ac, nˆe´u mˆa˜u bitmap d¯u.o c ´ap du.ng `en mˆoi tru.`o.ng khˆong suˆo´t, ta cho.n v`a tu.o.ng u ´.ng m`au nˆo˙’i v`a m`au nˆ Vˆa´n d¯`ˆe ch´ınh tˆo m`au theo mˆa˜u l`a t`ım mˆo´i tu.o.ng quan gi˜ u.a vi tr´ı cu˙’a mˆa˜u v`a `an x´ac d¯i.nh vi tr´ı cu˙’a mˆa˜u d¯u.o c “neo” d¯ˆe˙’ biˆe´t pixel n`ao nguyˆen so N´oi c´ach kh´ac, ta cˆ mˆa˜u s˜e tu.o.ng u ´.ng v´o.i pixel hiˆe.n h`anh nguyˆen so Phu.o.ng ph´ap th´ u nhˆa´t l`a neo mˆa˜u ta.i mˆo.t d¯ı˙’nh cu˙’a mˆo.t d¯a gi´ac bˇ`a ng c´ach d¯aˇ t pixel 161 - iˆ `eu n`ay cho ph´ep mˆa˜u di chuyˆe˙’n bˆen tr´ai nhˆa´t xuˆa´t hiˆe.n h`ang d¯`ˆau tiˆen cu˙’a mˆa˜u D ´ ng tru c quan v´o i nh˜ u.ng mˆa˜u c´o cˆa´u tr´ uc h`ınh ho.c theo c´ac nguyˆen so ta.o mˆo.t hiˆe.u u nhu c´ac d¯u `o ng khˇa´c ch´eo song song thu `o ng d¯u o c su˙’ du.ng c´ac u ´ ng du.ng thiˆe´t kˆe´ V`ı khˆong c´o su phˆan biˆe.t gi˜ u.a c´ac d¯iˆe˙’m trˆen d¯a gi´ac v´o.i nh˜ u.ng mˆa˜u n`ay c˜ ung nhu trˆen c´ac nguyˆen so x´ac d¯.inh bo˙’.i c´ac d¯u.`o.ng biˆen tro.n nhu d¯u.`o.ng tr`on v`a ellipse Do d¯o´ ngu.`o.i lˆa.p `an x´ac d¯i.nh d¯iˆe˙’m neo nˇ`a m trˆen hoˇa.c nˇa` m nguyˆen so Trong mˆo.t v`ai hˆe thˆo´ng, tr`ınh cˆ d¯iˆe˙’m neo c´o thˆe˙’ cu˙’a mˆo.t nh´om c´ac nguyˆen so Trong phu.o.ng ph´ap th´ u hai, ta xem to`an bˆo m`an h`ınh d¯u.o c l´at v´o.i mˆa˜u tˆo v`a coi `om mˆo.t d¯u.`o.ng biˆen hoˇa.c v` ung d¯u.o c tˆo v´o.i nh˜ u.ng bit d¯aˇ c tru.ng cho ph´ep mˆa˜u nguyˆen so gˆ tˆo bˇang qua Vi tr´ı chuˆa˙’n cu˙’a mˆo.t neo tuyˆe.t d¯oˆ´i l`a gˆo´c m`an h`ınh C´ac pixel cu˙’a nguyˆen so sau d¯´o d¯u.o c xu˙’ l´ y bˇ`a ng c´ach AND gi´a tri v´o.i mˆa˜u tˆo Theo c´ach n`ay, mˆa˜u tˆo khˆong d¯u.o c “gˇa´n d´ınh” v´o.i nguyˆen so nguyˆen so ho.i di chuyˆe˙’n Thay v`ao d¯o´, nguyˆen so di `en v´o.i mˆa˜u cˆo´ d¯.inh, v`a d¯o´ h`ınh da.ng cu˙’a n´o c´o chuyˆe˙’n nhu thˆe˙’ n´o d¯u.o c d¯aˇ t trˆen mˆo.t nˆ uc h`ınh ho.c ngu.`o.i su˙’ du.ng thˆe˙’ bi thay d¯ˆo˙’i di chuyˆe˙’n; v´o.i c´ac mˆa˜u ch´ınh quy ´ıt c´o cˆa´u tr´ - ˆe˙’ t´ınh to´an hiˆe.u qua˙’, neo tuyˆe.t d¯oˆ´i cho ph´ep thˆa.m ch´ı khˆong nhˆa.n thˆa´y a˙’nh hu.o˙’.ng n`ay D c´ac nguyˆen so phu˙’ lˆen v`a tiˆe´p gi´ap kh´o.p v´o.i - ˆe˙’ ´ap du.ng mˆa˜u tˆo v´o.i nguyˆen so., ch´ D ung ta d¯´anh chı˙’ sˆo´ to.a d¯oˆ pixel hiˆe.n h`anh (x, y) V`ı c´ac mˆa˜u x´ac d¯.inh bo˙’.i c´ac ma trˆa.n nho˙’ k´ıch thu.´o.c M × N nˆen ta su˙’ du.ng ph´ep to´an modular d¯ˆe˙’ lˇa.p la.i mˆa˜u Pixel c´o mˆa˜u pattern[0, 0] xem nhu tr` ung v´o.i gˆo´c m`an h`ınh3 , v`a ch´ ung ta c´o thˆe˙’ viˆe´t, chˇa˙’ng ha.n, mˆo.t mˆa˜u bitmap mˆoi tru.`o.ng suˆo´t v´o.i d`ong lˆe.nh if pattern[x % M, y % N] putpixel(x, y, value); Nˆe´u tˆo m`au mˆo.t d¯oa.n chˆe´ d¯oˆ thay thˆe´ ch´ ung ta c´o thˆe˙’ ch´ep to`an bˆo h`ang cu˙’a mˆa˜u tˆo ta.i mˆo.t th`o.i d¯iˆe˙’m nˆe´u thu˙’ tu.c copypixel() d¯ˇa.t d¯iˆe˙’m v˜e o˙’ m´ u.c thˆa´p cho ph´ep `eu pixel c` viˆe´t nhiˆ ung mˆo.t l´ uc Chˇa˙’ng ha.n, x´et mˆa˜u l`a ma trˆa.n × Do d¯o´ n´o lˇa.p mˆo˜i d¯oa.n u.c l`a, nˆe´u ho`anh d¯oˆ cu˙’a pixel Nˆe´u d¯iˆe˙’m bˆen pha˙’i nhˆa´t cu˙’a mˆo.t d¯oa.n l`a byte d¯u.o c g´an-t´ pixel d¯`aˆu tiˆen chia hˆe´t 8-th`ı to`an bˆo h`ang d¯`aˆu tiˆen cu˙’a mˆa˜u c´o thˆe˙’ d¯u.o c v˜e bˇ`a ng thu˙’ tu.c `eu lˆ `an d¯ˆe˙’ v˜e to`an bˆo d¯oa.n Nˆe´u pixel copypixel() viˆe´t pixel; thu˙’ tu.c n`ay d¯u.o c go.i la.i nhiˆ `an d¯u.o c cuˆo´i c` ung cu˙’a d¯oa.n khˆong pha˙’i l`a byte d¯u o c g´an th`ı c´ac pixel khˆong thuˆo.c d¯oa.n cˆ - ˆe˙’ thu c hiˆe.n hiˆe.u qua˙’ nh˜ d¯ˇa.t mˇa.t na D u.ng tru.`o.ng ho p d¯aˇ c biˆe.t cu˙’a c´ac thuˆa.t to´an raster, ch´ ung ta c´o thˆe˙’, chˇa˙’ng ha.n kiˆe˙’m tra tru.´o.c d¯ˆe˙’ khu˙’ c´ac v`ong lˇa.p bˆen v`a viˆe´t la.i c´ac v`ong lˇa.p n`ay bˇ`a ng ngˆon ng˜ u Assemble (xem [9]) Trong c´ac hˆe thˆo´ng cu˙’.a sˆo˙’, mˆa˜u tˆo thu.`o.ng d¯u.o c neo ta.i gˆo´c cu˙’a hˆe to.a d¯ˆo cu˙’.a sˆo˙’ 162 Thu viˆ e.n graph2D.h `an n`ay, ch´ Trong phˆ ung tˆoi tˆa.p ho p nh˜ u.ng kiˆe˙’u d˜ u liˆe.u quan tro.ng v`a c´ac khai b´ao d¯u.o c su˙’ ung d¯u.o c d¯u.a du.ng gi´ao tr`ınh Nh˜ u.ng thu˙’ tu.c v`a h`am thu.`o.ng xuyˆen d¯u.o c su˙’ du.ng c˜ o˙’ d¯aˆy #if !defined(_graph2D_h) #define _graph2D_h #define PI 3.141592654 #define TWOPI 6.283185308 #define MAXVVERTICES 50 #define MAXCOLUMS 639 #define MAXROWS 479 #define TILE_SIZE 16 #define TRUE #define FALSE #define CLIP_ON #define CLIP_OFF typedef unsigned char Byte; typedef unsigned char Boolean; typedef struct { float x, y; } Point2D; 163 typedef struct { float dx, dy; } Vector2D; typedef struct { int x, y; } Pixel; typedef struct { Point2D First, Second; } Segment2D; typedef struct { Vector2D Normal; float D; } Line2D; typedef struct { float xmin, xmax, ymin, ymax; } Rectangle2D; typedef struct { Point2D Center; float Rad; } Circle2D; typedef struct VertNode2D *VertPtr2D; struct VertNode2D { Point2D Vertex; 164 VertPtr2D Next; }; typedef struct PolyLink *PolyPtr; struct PolyLink { VertPtr2D Start; PolyPtr Next; }; typedef Point2D (*Function) (float); int feoln(FILE *fp) { char c; if ((c = fgetc(fp)) == 10) { fseek(fp, -2, 1); return(True); } else if (c == EOF) return(True); else { fseek(fp, -1, 1); return(False); } } void freadln(FILE *fp) { char c; while (((c = fgetc(fp)) != 10) && (c != EOF)); } 165 float min(float x, float y) { return((x > y) ? y : x); } float max(float x, float y) { return((x > y) ? x : y); } void PointToVector2D(Point2D P, Vector2D *p) { (*p).dx = P.x; (*p).dy = P.y; } float Length2D(Vector2D v) { return(sqrt(v.dx*v.dx + v.dy*v.dy)); } void Scale2D(Vector2D v, float r, Vector2D *Ans) { (*Ans).dx = r*v.dx; (*Ans).dy = r*v.dy; } void Normalize(Vector2D v, Vector2D *Ans) { float Len; Len = Length2D(v); if (Len == 0.0) printf("Zero vector in Normallize()"); else { 166 (*Ans).dx = v.dx/Len; (*Ans).dy = v.dy/Len; } } float Dot2D(Vector2D a, Vector2D b) { return(a.dx*b.dx + a.dy*b.dy); } void Build_nD(Vector2D *n, float *D, Point2D F, Point2D S) { (*n).dx = S.y - F.y; (*n).dy = F.x - S.x; (*D) = F.x*S.y - F.y*S.x; } void CreateVert2D(VertPtr2D *Vertices) { (*Vertices) = NULL; } Boolean EmptyVert2D(VertPtr2D Vertices) { return((Vertices == NULL) ? True : False ); } void PushVert2D(VertPtr2D *Vertices, Point2D Vertex) { VertPtr2D Tempt; Tempt = (VertPtr2D) malloc(sizeof(struct VertNode2D)); Tempt->Vertex = Vertex; Tempt->Next = (*Vertices); (*Vertices) = Tempt; } 167 void PopVert2D(VertPtr2D *Vertices, Point2D *Vertex) { VertPtr2D Tempt; if (EmptyVert2D(*Vertices)) { printf(" Thao tac tro khong hop le "); return; } else { Tempt = (*Vertices); (*Vertex) = Tempt->Vertex; (*Vertices) = Tempt->Next; free(Tempt); } } void ReadVert2D(char *FileName, VertPtr2D *Vertices) { Point2D Vertex; FILE *FileData; if ((FileData = fopen(FileName, "rt")) == NULL) { printf("File khong tim thay"); return; } CreateVert2D(Vertices); while (!feof(FileData)) { fscanf(FileData, "%f %f", &Vertex.x, &Vertex.y); PushVert2D(Vertices, Vertex); } fclose(FileData); 168 } void FreeVertPtr2D(VertPtr2D *Vertices) { Point2D Vertex; while (!EmptyVert2D(*Vertices)) PopVert2D(Vertices, &Vertex); } void DrawPoly(VertPtr2D Vertices) { VertPtr2D Tempt = Vertices; if (Tempt == NULL) return; moveto(Tempt->Vertex.x, Tempt->Vertex.y); while ((Tempt = Tempt->Next) != NULL) { lineto(Tempt->Vertex.x, Tempt->Vertex.y); } } void DrawCurve(float a, float b, int NumPoints, Function Func) { float Delta = (b - a)/ (float)NumPoints; float t = a; int i; moveto(Func(t).x, Func(t).y); for (i = 1; i

Ngày đăng: 16/07/2020, 11:12

Từ khóa liên quan

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

Tài liệu liên quan