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 ... ymin, ymax; } Rectangle2D; typedef struct { Point2D Center; float Rad; } Circle2D; typedef struct VertNode2D *VertPtr2D; struct VertNode2D { Point2D Vertex; 164 VertPtr2D Next; }; typedef struct... 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) {... CreateVert2D(VertPtr2D *Vertices) { (*Vertices) = NULL; } Boolean EmptyVert2D(VertPtr2D Vertices) { return((Vertices == NULL) ? True : False ); } void PushVert2D(VertPtr2D *Vertices, Point2D Vertex) { VertPtr2D