1. Trang chủ
  2. » Công Nghệ Thông Tin

Đồ họa máy tính - Chương 5 Tô màu, Font chữ - Bài 16 pot

6 579 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 243,13 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các hình thang cơ bản sẽ là các hình giới hạn bởi các đoạn thẳng P1,P2, P3,P4 ...P2n-1, P2m và các đoạn thẳng thuộc các cạnh của đa giác Ví dụ: Bài tập: Hãy diễn đạt chính xác thuật to

Trang 1

Các hình thang cơ bản sẽ là các hình giới hạn bởi các đoạn thẳng (P1,P2), (P3,P4) .(P2n-1, P2m) và các đoạn thẳng thuộc các cạnh của đa giác

Ví dụ:

Bài tập:

Hãy diễn đạt chính xác thuật toán trên và lập chương trình phân chia đa giác thành

các hình thang cơ bản

$16 Các thuật toán tô mμu

1 Thuật toán tô màu hình thang cơ bản

Giả sử cho hình thang cơ bản có dạng:

(x4y4) (x3y3)

Thuật toán như sau:

1 Đặt ymin=y1; ymax=y3; m=ymax-ymin+1

2 tính hệ số góc Cl=(x4-x1)/(y4-y1)

Cr=(x3-x2)/(y3-y2)

=1,

W8 W1

W1

W7

W6 W2

W4

W5 1

2

3 W2

3 2

4

7

9

5 5

W4 6

W3

Trang 2

3 Kẻ đoạn thẳng (x yil, ) , (x y, )

r

i bằng màu tô

Chú ý

1 Khi hình thang cơ bản biến dạng về tam giác chẳng hạn x1=x2, y1=y2

(x3y3) (x4y4)

(x1y1) khi đó:

xil=xil−1+Cl

xir =xir−1+Cr

2 Tô màu đa giác

Dựa vào kết quả của việc phân chia đa giác thành tổng các hình thang cơ bản ta suy

ra để tô màu một đa giác bất kỳ, ta cần phân chia đa giác thành tổng các hình thang cơ bản và sau đó tô màu các hình thang đã đ−ợc chia

3 Tô màu một vùng kín bất kỳ

Cho một tập các pixel tập đ−ợc gọi là liên thông nếu từ một pixel ta có thể di chuyển

đến các pixel bất kỳ thuộc tập

Cho một tập W các điểm ảnh (Pixel) tập W gọi là liên thông cấp 8 nếu mỗi pixel có

8 điểm lân cận thuộc tập

Cho một tập W các điểm ảnh (pixel) tập đ−ợc gọi là liên thông cấp 4 nếu mỗi điểm

ảnh thuộc tập có 4 điểm lân cận thuộc tập

Trang 3

Bài toán tô màu vùng bất kỳ

Cho một tập W các điểm ảnh liên thông cấp 4 được giới hạn bởi đường biên có mầu

cb và một điểm ảnh trong W hãy tô vùng W bằng màu Ct

ý tưởng của thuật toán đơn giản như sau: Xuất phát từ điểm trong P của vùng W kiểm tra 4 điểm lân cận của P là P1,P2,P3,P4 nếu điểm Pi (i =1 4 , ) không có mầu Cb thì tô Pi bằng Ct và lại coi Pi là điểm trong P của W, quá trình được lặp lại cho đến khi gặp màu biên Cb Thuật toán ngắn gọn trên có thể được gọi là thuật toán vết dầu loang

Thuật toán ngắn gọn trên có thể mô tả bằng thủ tục đệ quy sau :

Procedure Tomau(x,y,Cb,Ct: Integer);

Begin

If Color(x,y)<> Cb and Color(x,y)<>Ct Then

Begin

Putpixel (x,y,Ct);

Tomau(x,y-1,Cb,Ct);

Tomau(x,y+1,Cb,Ct);

Tomau(x-1,y,Cb,Ct);

Tomau(x+1,y,Cb,Ct);

End;

End;

Chú ý :

Thuật toán trên có ưu điểm là chương trình ngắn gọn song do thủ tục đệ quy nên yêu cầu bộ nhớ rất lớn, nếu miền W có n điểm ảnh thì bộ nhớ cần n4

Vì vậy nếu vùng W quá lớn sẽ dẫn đến tràn bộ nhớ Để khắc phục nhược điểm này

ta có thể cải tiến thuật toán như sau:

1 Xác định Ymin, Ymax, Xmin, Xmax chứa vùng W

2 Từ điểm trong P di chuyển theo OX để tô các điểm có cùng toạ độ Y Sau đó lại dịch chuyển theo OY

Chương trình minh hoạ :

P Y

Trang 4

Program Flood_Fill;

Uses Crt,Graph;

Var

Gd,Gm : Integer;

Procedure To_Mau(a,b,mv,mt : Integer);

(* -*)

Procedure Tm(x,y,mv,mt,u : Integer);

Var

a1,a2,b,t,k,t1,t2 : Integer;

Procedure Tim(a1,a2,b,mv,u : Integer;Var x : Integer);

Var

i : Integer;

Begin

x:=0;

While GetPixel(a1,b+u)=mv Do Inc(a1);

While GetPixel(a2,b+u)=mv Do Dec(a2);

For i:=a1 To a2 Do

Begin

If (GetPixel(i,b+u)=mv) Then

Begin x:=i;Break;End;

End;

End;

Procedure Tim1(a1,a2,b,mv,u : Integer;Var x : Integer);

Var

i : Integer;

Begin

x:=0;

For i:=a1 To a2 Do

Begin

If (GetPixel(i,b+u)<>mv) Then

Begin x:=i;Break;End;

End;

End;

Begin

SetColor(mt);

b:=y;

Repeat

a1:=x;a2:=x;t:=0;k:=0;t1:=0;t2:=0;

While GetPixel(a1-1,b)<>mv Do

Begin

If GetPixel(a1,b+u)<>mv Then t:=a1;

Dec(a1);

Trang 5

If GetPixel(a2,b+u)<>mv Then t:=a2;

Inc(a2);

End;

Line(a1,b,a2,b);

Tim(a1,a2,b,mv,1,k);

If k<>0 Then

Begin

Tim1(k,a2,b,mv,1,t1);

If (t1<>0)And(GetPixel(t1,b+1)<>mt) Then Tm(t1,b+1,mv,mt,1);

Tim1(a1,k,b,mv,1,t2);

If (t2<>0)And(GetPixel(t2,b+1)<>mt) Then Tm(t2,b+1,mv,mt,1);

End;

k:=0;t1:=0;t2:=0;

Tim(a1,a2,b,mv,-1,k);

If k<>0 Then

Begin

Tim1(a1,a2,b,mv,1,t1);

If (t1<>0)And(GetPixel(t1,b+1)<>mt) Then Tm(t1,b+1,mv,mt,1);

t1:=0;

Tim1(k,a2,b,mv,-1,t1);

If (t1<>0)And(GetPixel(t1,b-1)<>mt) Then Tm(t1,b-1,mv,mt,-1);

Tim1(a1,k,b,mv,-1,t2);

If (t2<>0)And(GetPixel(t2,b-1)<>mt) Then Tm(t2,b-1,mv,mt,-1);

End;

b:=b+u;

If t<>0 Then x:=t;

Until T=0;

End;

(* -*)

Begin

Tm(a,b,mv,mt,1);

Tm(a,b,mv,mt,-1);

End;

(* -*)

Begin

Gd:=0;

Initgraph(Gd,Gm,'C:\Tp\Bgi');

RanDomize;

Line(50,50,600,400);

Line(600,400,350,100);

Line(350,100,550,250);

Line(550,250,550,200);

Line(600,300,550,200);

Trang 6

Line(500,150,450,30);

Line(400,80,450,30);

Line(50,50,400,80);

Repeat

To_Mau(250,70,White,RanDom(14)+1);

settextjustify(1,1);

settextstyle(1,0,2);

Outtextxy(320,400,'Press ESCAPE to Exit');

Repeat

Until KeyPressed;

Until (KeyPressed)And(ReadKey=#27);

CloseGraph;

End

$17 Xử lý ký tự trên mμn hình

Để biểu diễn các ký tự trên màn hình người ta sử dụng 2 byte cho 1 ký tự một byte - mã (code) của ký tự một byte - thuộc tính (attribute) của ký tự Mã của ký tự là một

số trong tập từ 0-256 Byte thuộc tính dùng để xác định tính chất hiển thị của ký tự trên màn hình như màu sắc, chế độ hiện nhấp nháy (Blink)

Mỗi ký tự có khuôn mẫu của nó người ta gọi là shape hay pattern của ký tự Khuôn mẫu của ký tự được lưu trong máy bằng một số byte nào đó tuỳ thuộc vào khuôn mẫu của ký tự Trong máy tính người ta dành 32 byte để lưu giữ khuôn mẫu cho mọi

ký tự Người ta tạo các byte biểu diễn khuôn mẫu của một ký tự theo nguyên tắc sau:

ở chế độ hộp ký tự 8x8:

ở chế độ hộp ký tự 8x14

Ngày đăng: 24/07/2014, 10:21

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm