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;