Nđ Clipping (c tb nh ng ph n không nm trong ca s)

Một phần của tài liệu Bài giảng môn đồ hoạ máy tính (Trang 64)

V n đ đ t ra là c n ph i c t b nh ng ph n c a đ i t ng không n m trong c a s . Vì ta đã coi đo n th ng là nguyên th đ h a nên v n đ quy v vi c làm sao đ clipping m t đo n th ng. Sau đây ta áp d ng thu t toán Cohen – Sutherland đ gi i quy t v n đ này.

Tr c h t xét m t đi m (X,Y). N u t a đ c a nó vi ph m m t trong các đi u ki n sau thì đi m đó n m ngoài c a s và s b lo i b

F1≤ X ≤ F2 và F3≤ Y ≤ F4

D u b ng cho th y các đi m n m trên biên đ c coi nh n m trong c a s .

V i đo n th ng, ta kéo dài các đ ng biên c a s thành các đ ng th ng. Chúng chia m t ph ng làm 9 vùng. M i đi m trong m t ph ng s t ng ng v i mã 4 bit đ c xác đnh theo quy t c sau:

• bit th 1 là 1 n u đi m đó n m bên trái c a s

• bit th 3 là 1 n u đi m đó n m bên d i c a s

• bit th 4 là 1 n u đi m đó n m bên trên c a s

0110 0010 0100 C a s 0000 0101 0001 1010 1001 1000 Nh n xét;

• o n th ng n m hoàn toàn trong c a s khi và ch khi mã c a c 2 đ u mút là 0000. Ng c l i, n u m t trong hai mã khác 0000 thì đo n th ng có 1 ph n ho c toàn b n m ngoài c a s

• N u k t qu phép AND hai mã c a 2 đ u mút khác 0000 thì đo n th ng t ng ng hoàn toàn n m ngoài c a s và s không đ c hi n th lên màn hình.

n 0001 0101 0000 0100 0010 0110 d c g e f h i j a b m 1001 1000 1010 Các b c:

- N u c hai mã thu c tính đ u là 0000 thì đo n th ng hoàn toàn n m trong c a s - N u k t qu phép AND hai mã khác 0000 thì đo n th ng hoàn toàn n m ngoài c a s - Tr ng h p không r i vào hai kh n ng trên: giao đi m c a đo n th ng v i biên c a

s chia đo n th ng đã cho thành nhi u đo n. Ta xét t ng đo n theo cách nh trên. Toàn b các b c k trên đ c th hi n trong th t c CAT d i đây:

PROCEDURE Cat (X1,Y1,X2,Y2 : Real); TYPE Region = (Left,Right,Low,High); Code = SET OF Region;

VAR C,C1,C2 : Code; X,Y : Real;

XX1,YY1 : Integer; XX2,YY2 : Integer;

PROCEDURE MaNhiPhan (X,Y : Real; VAR C : Code); {T o mã thu c tính cho 2 đ u, xây d ng t p C c a đi m (X,Y)}

BEGIN C := [];

IF X < XgFen THEN C := [Left] {n m bên trái đ ng th ng X=XgFen} ELSE IF X > XdFen THEN C := [Right];

IF Y < YbFen THEN C := C+[Low]

ELSE IF Y > YhFen THEN C := C+[High] END; {MaNhiPhan}

BEGIN

MaNhiPhan (X1,Y1,C1); MaNhiPhan (X2,Y2,C2);

WHILE (C1 <> []) OR (C2 <> []) DO {ch ng nào ít nh t 1 trong 2 đi m còn n m ngoài c a s }

BEGIN {C t d n đ tìm đo n hi n th }

IF (C1*C2) <> [] THEN Exit; {C1∩C2 ≠∅: c t toàn b }

IF C1 = [] THEN C := C2 ELSE C := C1; {ch n C là đi m n m ngoài} IF Left IN C

THEN BEGIN

{tìm giao đi m (X,Y) v i dt X=XgFen} X := XgFen;

Y := Y1+(Y2-Y1)*(XgFen-X1)/(X2-X1) END

ELSE IF Right IN C THEN

{tìm giao đi m (X,Y) v i dt X=XdFen} BEGIN X := XdFen; Y := Y1+(Y2-Y1)*(XdFen-X1)/(X2-X1) END ELSE IF Low IN C THEN BEGIN Y := YbFen; X := X1+(X2-X1)*(YbFen-Y1)/(Y2-Y1) END

ELSE IF High IN C THEN BEGIN

Y := YhFen;

X := X1+(X2-X1)*(YhFen-Y1)/(Y2-Y1) END;

IF C = C1 {X1,Y1 n m ngoài c a s } THEN BEGIN

X1 := X; {gán giao đi m (X,Y) m i tìm đ c cho (X1,Y1)} Y1 := Y;

MaNhiPhan (X,Y,C1) {tính l i t p C1} END

ELSE BEGIN {X2,Y2 n m ngoài c a s } X2 := X; Y2 := Y; MaNhiPhan (X,Y,C2) END END; {While} XX1 := Round ((X1-XgFen)*Xtl); YY1 := Round ((YhFen-Y1)*Ytl); XX2 := Round ((X2-XgFen)*Xtl); YY2 := Round ((YhFen-Y2)*Ytl); MoveTo (XX1,YY1);

LineTo (XX2,YY2) END;

5. V tr c t a đ

V trí t ng đ i gi a h tr c và c a s có r t nhi u tr ng h p. Ta quy c ch v tr c m t cách t ng đ i, không tính toán chính xác theo v trí tuy t đ i, nói cách khác vi c v tr c ch mang tính trang trí, mang l i cho ng i xem c m giác v v trí t ng đ i c a đ i t ng so v i h tr c.

- Tr c nào c t c a s thì đ nguyên và v lên t m nhìn

- Tr c nào không c t qua c a s : t nh ti n ép sát vào mép trái ho c mép d i c a s - Tr c nào v n đã trùng v i mép trái ho c mép d i c a s thì đ nguyên

Nh v y cu i cùng hình d ng c a s có kèm theo h tr c t a đ s có m t trong 4 d ng sau:

2 tr c không c t c a s 2 tr c đ u c t c a s : đ nguyên tr c Oy c t c a s : gi nguyên tr c Ox c t c a s : gi nguyên PROCEDURE Truc; CONST dX = 5; dY = 4;

PROCEDURE MuiTenTrenX; {gi s lúc đ u con tr CP đã A} BEGIN {Ve mui ten tren truc X}

MoveRel (-dX,dY); {kéo CP v B} LineRel (dX,-dY); {v BA}

MoveRel (-dX,-dY); {kéo CP v C} LineRel (dX,dY) {v CA}

END;

dX B

C PROCEDURE MuiTenTrenY;

BEGIN {Ve mui ten tren truc Y} MoveRel (-dY,dX); LineRel (dY,-dX); A MoveRel (dY,dX); LineRel (-dY,-dX) dY END; BEGIN

IF (XgFen < 0) AND (XdFen > 0) THEN XOrig := 0

ELSE XOrig := XgFen; {mep trai} IF (YbFen < 0) AND (YhFen > 0) THEN YOrig := 0

ELSE YOrig := YbFen; {mep duoi} Diem (XgFen,YOrig);

VeDen (XdFen,YOrig); {Ve truc X} MuiTenTrenX;

Diem (XOrig,YbFen);

VeDen (XOrig,YhFen); {Ve truc Y} MuiTenTrenY;

END;

Một phần của tài liệu Bài giảng môn đồ hoạ máy tính (Trang 64)

Tải bản đầy đủ (PDF)

(94 trang)