2.2.1. Băi tôn
Cho đa giâc S xâc ñịnh bởi n ñỉnh : P1, P2, ..., Pn. Hêy tô mău miền S.
* Phương phâp tổng quât :
- Tìm hình chữ nhật W nhỏ nhất chứa S (hình 2.4).
- Duyệt qua tất cả câc ñiểm P(x, y) ∈ W. Nếu P ∈ S thì tơ mău điểm P.
2.2.2. Thuật tôn xâc định P ∈∈∈∈ S 2.2.2.1. S lă ña giâc lồi
- Lấy P ∈ W, nối P với câc ñỉnh của S thì ta được n tam giâc : Si= PPiPi+1, với Pn+1=P1. - Nếu ∑ = n 1 i) dt(S i = dt(S) thì P ∈ S. Ta có cơng thức tính diện tích của S:
S= ∑ = + + − n i i i i iy x y x 1 1 1 )| ( | 2 1
2.2.2.2. Trường hợp tổng quât (Thuật toân Jordan)
Lấy P(x, y) ∈ W, kẻ nửa ñường thẳng ∆P xuất phât từ P vă khơng đi qua câc đỉnh
của ña giâc S.
Gọi S(P) lă số giao ñiểm của ∆P với câc biín của S. Nếu S(P) lẻ thì P ∈ S.
* Vấn đề cịn lại lă tìm S(P):
Bước 1: Kẻ nửa ñường thẳng ∆P // 0y vă hướng về phía y>0.
Bước 2: Với mỗi cạnh Ci= PiPi+1 của S: + Nếu x=xi thì xĩt 2 cạnh có 1 đầu lă Pi: Nếu y<yi thì S W P 2 P3 P 4 P 5 P1 Hình 2.4
• Nếu cả 2 đầu kia ở cùng một phía của ∆P thì ta tính ∆P cắt cả 2 cạnh.
• Ngược lại : ∆P cắt 1 cạnh. + Ngược lại:
• Nếu x>Max(xi,xi+1) hoặc x<Min(xi,xi+1) thì ∆P khơng cắt Ci
• Ngược lại:
-Nếu y<= Min(yi, yi+1) thì ∆P cắt Ci -Ngược lại :
Xĩt tọa ñộ giao ñiểm (x0, y0) của ∆P với Ci
Nếu y >= y0 thì ∆P khơng cắt Ci. Ngược lại ∆P cắt Ci. Thuật tơn năy có thể được căi đặt bằng đoạn chương trình như sau:
Type ToaDo=record x,y:integer; End;
Mang=array[0..30] of ToaDo;
Function SOGIAODIEM(a:Mang; n:Byte):Integer; var dem,i,j,s:Integer;
Begin dem:=0;
for i:=1 to n do { Tim so giao diem } begin
if i=n then j:=1 else j:=i+1; if i=1 then s:=n else s:=i-1; if x=a[i].x then
begin
if y<a[i].y then
if (x<=Min(a[s].x ,a[j].x))OR
(x>=Max(a[s].x,a[j].x)) then dem:=dem+2 else dem:=dem+1;
end else
if (x>Min(a[i].x,a[j].x)) and (x<Max(a[j].x,a[i].x)) then
if y<=Min(a[i].y,a[j].y) then dem:=dem+1 else if y <= (x-a[j].x)*(a[i].y-a[j].y)/ (a[i].x-a[j].x)+a[j].y then dem:=dem+1; end;
SOGIAODIEM:=dem; End;
Chương IỊ Tô mău
30
2.2.3. Thuật tôn tơ mău theo dịng quĩt (Scanline)
ðặt x0 = Min(xi), i∈ [1,n].
Bước 1: Kẻ Dy//0y ñi qua x0 (hình 2.5).
Bước 2: Xâc định câc giao ñiểm Mi-
(x,y) của Dy với câc cạnh Ci.
Nếu có cạnh Ci = PiPi+1 song song vă trùng với Dy thì xem như Dy cắt Ci tại 2 ñiểm Pi vă Pi+1.
Bước 3: Sắp xếp lại câc ñiểm Mi theo thứ tự tăng dần ñối với yi (ñiểm ñầu
tiín có thứ tự lă 1).
Bước 4: Những điểm nằm trín Dy ở giữa giao điểm lẻ vă giao ñiểm chẵn liín tiếp lă
những ñiểm nằm trong ña giâc vă những ñiểm năy sẽ được tơ.
Bước 5: Tăng x0 lín một Pixel. Nếu x0 ≤ Max(xi) thì quay lại bước 1.
2.2.4. Thuật tôn tơ mău theo vết dầu loang
Lấy P(x,y) ∈ S, tô mău P.
Xĩt câc ñiểm lđn cận của P (Hình 2.6).
Nếu câc điểm lđn cận đó vẫn cịn thuộc S vă chưa được tơ mău thì tơ mău câc điểm lđn cạn đó...
Thuật tơn trín có thể được minh họa bằng thủ tục ñệ qui:
Procedure TOLOANG(x,y:Integer; Color:Word); Begin
If (P(x,y)∈S)and(P(x,y)chưa tô) Then Begin PutPixel(x,y,Color); TOLOANG(x+1,y,Color); TOLOANG(x-1,y,Color); x 0 xi x Dy y Hình 2.5 O X X X X O Hình 2.6
TOLOANG(x,y+1,Color); TOLOANG(x,y-1,Color); End;
End;
BĂI TẬP
1. Viết hăm DienTich(P:Array; n:Byte); để tính diện tích của đa giâc lồi có n đỉnh
lưu trong mảng P.
2. Viết hăm KiemTrăx,y:Integer; P:Array; n:Byte):Boolean; ñể kiểm tra ñiểm
(x,y) nằm trong hay ngoăi ña giâc có n ñỉnh ñược lưu trong mảng P theo hai câch: - Dùng cơng thức tính diện tích đa giâc (đối với đa giâc lồi).
- Dùng thuật tôn Jordan (đối với đa giâc bất kỳ).
2. Viết chương trình căi đặt thuật tơn tơ mău một đa giâc theo thuật tôn Scanlinẹ 3. Viết chương trình căi đặt thuật tơn tơ mău một đa giâc theo vết dầu loang theo hai phương ân:
ạ ðệ quị b. Khử ñệ quị
4. Viết thủ tục FillRec(x1,y1,x2,y2:Integer; color:Byte); để tơ mău hình chữ nhật xâc
ñịnh bởi 2 ñỉnh (x1,y1) vă (x2,y2).
5. Viết thủ tục FillEllipse(x,y,Rx,Ry:Integer; color:Byte); để tơ mău Ellipse có tđm (x,y) vă bân kính theo hai trục lă Rx vă Rỵ
6. Viết thủ tục FillSector(x,y,Rx,Ry,g1,g2:Integer; color:Byte); để tơ mău hình quạt Ellipse có tđm (x,y), bân kính theo hai trục lă Rx vă Ry, góc bắt đầu lă g1 vă góc kết thúc lă g2.
7. Viết thủ tục Donut(x,y,Rmin,Rmax:Integer; color:Byte); ñể tơ mău hình vănh
khăn có tđm (x,y) vă bân kính hai đường trịn tương ứng lă Rmin vă Rmax.
Băi tập lớn: Xđy dựng một thư viện ñồ họa MYGRAPH tương tự như thư viện
CHƯƠNG III XĨN HÌNH
3.1. ðẶT VẤN ðỀ
Cho một miền D ⊂ Rn vă F lă một hình trong Rn (F ⊂ Rn). Ta gọi F ∩ D lă hình có
được từ F bằng câch xĩn văo trong D vă ký hiệu lă ClipD(F).
Băi toân ñặt ra lă xâc ñịnh ClipD(F).
3.2. XĨN ðOẠN THẲNG VĂO VÙNG HÌNH CHỮ NHẬT CỦA R2