Tải bản đầy đủ (.pdf) (28 trang)

Lập trình bằng Turbo Pascal part 9 potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (309.16 KB, 28 trang )

Lập trình bằng Turbo Pascal
var Gd, Gm: integer; { Gd = Graphic Device }
begin Gd:= detect; { Gm = Graphic Mode }
InitGraph(Gd, Gm,' đờng dẫn \BGI');
if graphresult <> grOk then
begin write ( 'lỗi khởi tạo đồ hoạ');
halt(1);
end;
end;

1.2.2 GiảI thích ý nghĩa.
Các tham số trong thủ tục InitGraph:
Gd, Gm l hai tham biến, nhận các giá trị l các hằng số nguyên,
đợc định nghĩa trong Unit Graph. Gd, Gm có thể nhận các giá trị no v ý
nghĩa của chúng có thể tham khảo trong Unit Graph.
Tham số đờng dẫn \ BGI: phải thay bằng đờng dẫn cụ thể đến th
mục BGI trong máy của mình.
Có thể để cho Turbo Pascal tự phát hiện vỉ mn hình v chọn chế độ
đồ họa thích hợp nhất.
Đó l cách khởi tạo tự động, bằng cách đặt Gd:=
Detect nh trong ví dụ trên. Lúc ny không cần gán giá trị cho Gm.
Trong trờng hợp nắm vững thiết bị mn hình hiện có v các chế độ đồ
hoạ tơng ứng, ta có thể gán trực tiếp giá trị cho Gd, Gm.
Ví dụ:
Gd:= VGA; Gm:= VGAHi ;
Initgraph(Gd,Gm,'C:\TP\BGI' );
Lu ý không đợc viết trực tiếp
Initgraph(VGA, VGAHi,'C:\TP\BGI');
Nh thế sai cú pháp vì các Gd, Gm l tham biến chứ không phải tham trị.
Sau khi gọi thủ tục khởi tạo đồ hoạ cần kiểm tra kết quả xem việc khởi
tạo có thnh công hay không thông qua gọi hm GraphResult.



GraphResult: l hm có sẵn trong Unit Graph. GraphResult trả về kết
quả l một số nguyên. Đó l mã lỗi khởi tạo đồ hoạ.
Bảng sau đây cho biết giá trị v ý nghĩa của các mã lỗi đồ hoạ.

Giá trị số Tên hằng Y nghĩa
0
-1
-2
-3
grOk
grNoInitgraph
grNotDetected
grFileNotFound

thnh công
cha khởi tạo đợc
không có phần cứng;
không có các tệp điều khiẻn
đồ hoạ.


Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 217
Lập trình bằng Turbo Pascal
1.2.3 Đóng thủ tục đồ hoạ

Dùng thủ tục chuẩn CloseGraph. Thủ tục CloseGraph không có tham
số.

CloseGraph;


Tác dụng:
- Khôi phục lại chế độ hiển thị ban đầu của mn hình trớc khi gọi
khởi tạo đồ hoạ;
- Giải phóng bộ nhớ đã cấp trên heap lm vùng nhớ đệm đồ hoạ;
- Giải phóng vùng nhớ chứa các trình điều khiển thiết bị, các font chữ
nếu đã xin cấp phát thông qua sử dụng các thủ tục GraphGetMem,
GraphFreeMem.

1.3 Một chơng trình đồ hoạ đơn giản

Chơng trình sau đây khởi tạo chế độ đồ hoạ v vẽ một đờng chéo
mu vng trên mn hình nền mu xanh.

program ve_hinh;
uses crt,graph;
BEGIN
KhoiTaoDoHoa;

SetBkColor(blue);
SetColor(yellow);
Moveto(0,0);
Lineto(GetmaxX, GetmaxY);
repeat until keypressed;

closeGraph;
END.

Ta có thể bổ xung thêm vo thân chơng trình các thủ tục vẽ hình chữ
nhật, đờng tròn , đổi mu nét vẽ



Rectangle(100,100,200,200);
SetColor(red);
circle(200,150,50);

1.4 Màu sắc, kiểu nét vẽ, kiểu tô nền.

Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 218
Lập trình bằng Turbo Pascal
Trong chơng trình trên ta gặp hai thủ tục SetBKColor v SetColor.
Đó l hai thủ tục đặt mu nền v mu nét vẽ. Ta có thể chọn các mu sắc
khác nhau, thay đổi cả bộ mu đang dùng thông qua các thủ tục thiết lập mu
sắc.
Chơng trình trên sẽ vẽ các đoạn thẳng, đờng tròn bằng nét liền
thông thờng. Ta có thể thay đổi để nét vẽ thnh đờng đậm hơn, đờng đứt
quãng, đờng chấm gạch, chấm chấm Đó l kiểu nét vẽ hay Line Style.
Thủ tục SetLineStyle cho phép thay đổi kiểu nét vẽ.
Một vấn đề khác l tô mu bên trong một đờng biên đóng kín, ví dụ
nh hình chữ nhật, hình tròn Ta có thể tô mu bằng một mu khác vơí mu
đờng biên (l mu nét vẽ) v khác với mu nền của ton mn hình. Hơn nữa
có thể trang trí phần bên trong ny bằng các mẫu trang trí khác nhau nh các
chấm điểm rải đều, các đờng thẳng song song, hình ô lới Đó l các mẫu
nền hay FillPatern. Các thủ tục SetFillPatern, SetFillStyle cho phép chọn
các mẫu tô khác nhau.
Có thể hạn chế các thao tác đồ hoạ trong một khung hình chữ nhật gọi
l ViewPort. Khái niệm ViewPort có phần giống nh Window trong chế độ
văn bản.
Tất cả những vấn đề trên sẽ đợc trình by kĩ hơn trong phần môi
trờng đồ hoạ.

2.
Các thủ tục đồ hoạ thờng dùng.

Trong Unit Graph có hng chục thủ tục vẽ các hình khác nhau. Tên
gọi của các thủ tục ny khá gợi tả nên việc sử dụng chúng không mấy khó
khăn.
Dới đây sẽ điểm lại những thủ tục hay dùng. Mỗi thủ tục sẽ đợc
trình by ngắn gọn nội dung gồm: tên, danh sách tham số v công dụng vắn
tắt. Nghĩa l cung cấp giao diện v chức năng để cho ngời lập trình biết m
sử dụng.
Chi tiết hơn cần tham khảo Unit Graph.

2.1 Di chuyển, vẽ một điểm, một đoạn thẳng.

MoveTo (X,Y: integer);
Đặt bút vẽ tại điểm có toạ độ (X,Y);
Lu ý trên mn hình đồ hoạ không có con chạy nhấp nháy tại vị trí
hiện tại.

PutPixel(X,Y: integer; Color: word);
Vẽ một điểm có mu Color tại vị trí X,Y.
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 219
Lập trình bằng Turbo Pascal

GetPixel(X,Y: integer): word;
Trả lại mu của điểm có toạ độ X,Y.

Các thủ tục vẽ đoạn thẳng.

LineTo (X,Y: integer);

Kẻ đoạn thẳng từ vị trí hiện tại đến điểm X,Y. Sau khi vẽ, vị trí của
bút vẽ l X,Y.
Line (X1, Y1, X2, Y2);
Kẻ đoạn thẳng từ điểm X1,Y1 đến điểm X2,Y2. Sau khi vẽ, vị trí
bút l X2,Y2.
LineRel (Dx, Dy) ;
Kẻ đoạn thẳng từ X,Y đến X+Dx, Y+Dy.

2.2 Các thủ tục vẽ hình.
Rectangle (X1,Y1, X2, Y2: integer );
Vẽ hình chữ nhật, không tô mu trong ruột.
X1,Y1 l góc trên tráI, X2,Y2 l góc dới phải.

Bar(X1,Y1,X2,Y2: integer );
Vẽ hình chữ nhật v tô mu trong ruột bằng mu vẽ.

Bar3D(X1, Y1, X2, Y2: Integer; Depth: Word; Top: Boolean);
Vẽ hình hộp khối chữ nhật 3-chiều, có tô bên trong theo mẫu v mu
xác định bởi SetFillStyle hoặc SetFillPattern.
Depth l độ sâu tính bằng số điểm ảnh. Nếu Top l TopOn thì hình
hộp có cả nắp bên trên. Nếu TopOff thì không có nắp. Lựa chọn
TopOff để có thể xếp chồng vi hộp mu sắc khác nhau tạo biểu đồ
hình hộp đứng.
Độ sâu hay dùng l 25% của độ rộng, ví dụ

Bar3D(X1, Y1, X2, Y2, (X2 - X1 + 1) div 4, TopOn);

DrawPoly(NumPoints: Word; var PolyPoints);
Vẽ đờng gấp khúc khép kín, dùng mu v nét vẽ hiện hnh.
NumPoints l số đỉnh, PolyPoints l mảng các đỉnh. Một đỉnh gồm hai

toạ độ X,Y.

Circle (X,Y: integer; R: word ) ;
Vẽ đờng tròn tâm X,Y bán kính R.

Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 220
Lập trình bằng Turbo Pascal
Arc (X,Y; Integer; StAngle, EndAngle, Radius; Word);
Vẽ một cung tròn có bán kính Radius v tâm l (X,Y), bắt đầu từ góc
StAngle (start angle) kết thúc tại góc EndAngle. Các số đo góc
StAngle, EndAngle tính theo độ.

Ellipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius: Word);
Vẽ cung ellipse bắt đầu từ góc StAngle (start angle), kết thúc tại góc
EndAngle, với hai bán trục l Xradius, Yradius v (X,Y) l tâm.

PieSlice(X, Y: Integer; StAngle, EndAngle, Radius: Word);
Vẽ v tô nền hình quạt có bán kính Radius, tâm tại (X,Y), bắt đầu từ
góc StAngle, kết thúc tại góc EndAngle. Khác với Arc chỉ vẽ ra một
cung cong, thủ tục ny vẽ ra hình quạt vì có tô nền bên trong.

Sector(X,Y: Integer; StAngle,EndAngle, XRadius, YRadius: Word);
Vẽ v tô nền một hình quạt ellipse. (X, Y) l tâm, XRadius v YRadius
l hai bán trục, bắt đầu từ góc StAngle, kết thúc tại góc EndAngle.

2.3 Tỷ lệ biểu kiến.

Khi tỷ lệ biểu kiến giữa hai trục X,Y không phải l 1:1 thì đờng tròn
có thể trở thnh ellipse, hình vuông có thể thnh hình chữ nhật. Có thể thay
đổi tỷ lệ ny, co giãn hai trục thích hợp để khắc phục điều đó


GetAspectRatio(var Xasp, Yasp: Word): Word;
Lấy tỷ lệ biểu kiến hiện hnh giữa hai chiều X,Y trên mn hình đồ hoạ.
Hm trả về Xasp / Yasp.
SetAspectRatio(Xasp, Yasp: Word);
Thay đổi tỷ lệ biểu kiến mặc định. Phục vụ cho vẽ hình tròn, hình
vuông. Nếu hình tròn bị méo có thể hoặc chỉnh phần cứng hoặc l
chỉnh bằng tỷ lệ biểu kiến sử dụng SetAspectRatio.

Ví dụ:

uses Graph;
var
Xasp, Yasp: Word;
XSideLength, YSideLength: Integer;
begin
KhoiTaoDoHoa;
GetAspectRatio(Xasp, Yasp);
XSideLength:= 20;

{Chỉnh tỷ lệ trục Y theo tỷ lệ biểu kiến}
YSideLength:= Round( (Xasp / Yasp) * XSideLength);
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 221
Lập trình bằng Turbo Pascal

{Vẽ hình thực sự "vuông"}
Rectangle(0, 0, XSideLength, YSideLength);
Readln;
CloseGraph;
end.


2.4 Viết chữ ra màn hình đồ hoạ

Trong chế độ đồ hoạ chỉ cho phép in xâu kí tự ra mn hình. Không thể
dùng các thủ tục Write để viết trực tiếp các kiểu giá trị số ra mn hình nh
đối với chế độ văn bản. Do đó phải sử dụng các hm, thủ tục chuyển đổi giá
trị số thnh xâu kí số, ví dụ Str(Val, St).
Trên mn hình đồ hoạ, vị trị hiện tại của bút vẽ gọi l CP - current
pointer - sẽ ở tại một điểm ảnh no đó. Khác với chế độ văn bản có con chạy
mn hình nhấp nháy, CP trong chế độ đồ hoạ không hiển thị trên mn hình.
Vị trị ny sẽ thay đổi sau mỗi thủ tục đồ hoạ. Cần tìm hiểu để biết sự di
chuyển của bút vẽ đối với từng thủ tục.
CP liên quan đến một số thủ tục m không chỉ rõ toạ độ bắt đầu của
thao tác đồ hoạ.

OutText(TextString: String);
In xâu kí tự TextString ra mn hình, bắt đầu từ vị trí CP.

OutTextXY(X,Y: Integer; TextString: String);
In xâu kí tự TextString ra mn hình bắt đầu từ vị trí (X,Y).

TextString l xâu kí tự cần in ra. Nếu dùng font vec tơ thì xâu kí tự bị
cắt bớt khi quá di, vợt quá khung của Viewport. Nếu sử dụng font bitmap
thì TextString quá di sẽ không đợc in ra. Mặc định l dùng font bitmap.

Các thủ tục trình by dới đây sẽ thiết lập cách thức in ra xâu kí tự:
theo hớng nằm ngang hay thẳng đứng, căn lề trái, phải, kích thớc con
chữ

SetTextJustify(Horiz, Vert: Word);

Xác lập cách căn vị trí dòng chữ cho các thủ tục OutText , OutTextXY.
Các tham số Horiz, Vert có thể nhận các giá trị hằng số nh trong bảng
dới

Horiz - Hớng nằm ngang Vert - Hớng thẳng đứng
Tên hằng Giá trị Tên hằng Giá trị

Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 222
Lập trình bằng Turbo Pascal
L
eftText
CenterText
RightText

0
1
2
B
ottomText
CenterText
TopText

0
1
2

Vị trị ban đầu của CP lấy lm mốc. Ví dụ, sau 2 lệnh
TextJustify(CenterText, CenterText);
OutTextXY(100, 100, 'ABC');
thì vị trí (100, 100) sẽ l ở chính giữa chữ B.

Mặc định l SetTextJustify(LeftText, TopText).
Nếu tham số có giá trị không hợp lệ, GraphResult sẽ trả về một mã lỗi
grError v cách căn vị trí không thay đổi.

SetTextStyle(Font, Direction: Word; CharSize: Word);
Xác định phong cách (Style) hiển thị chữ ra mn hình. Style gồm kiểu
chữ, hớng, kích thớc.

Tên hằng Giá trị Y nghia
Về font chữ
DefaultFont
TriplexFont
SmallFont
SansSerifFont
GothicFont

Về hóng viết
HorizDir
VertDir

Về kích thớc
UserCharSize


0
1
2
3
4



1
0


1 10

8x8 font bitmap
font vectơ (Stroked font)
"
"
"


Từ trái sang phải
Từ dới lên trên


L hệ số phóng to lên



Ví dụ:
Chơng trình dới đây sẽ in ra 4 dòng chữ, Size = 1 với kích thớc 1,
Size = 2 với kích thớc 2, Size = 3 với kích thớc 3, Size = 4 với kích thớc
4.

uses Graph;
var
Y, Size: Integer;

Begin
KhoiTaoDoHoa;
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 223
Lập trình bằng Turbo Pascal
Y:= 0;
for Size:= 1 to 4 do
begin
SetTextStyle(DefaultFont, HorizDir, Size);
OutTextXY(0, Y, 'Size = ' + Chr(Size + 48));
{48 l mã của số 0 }
Inc(Y, TextHeight('H') + 1);
end;
Readln;
CloseGraph;
end.

3.
Các thủ tục về môi trờng đồ hoạ
3.1 Các thủ tục thiết lập màu.
3.1.1 Bảng tên mu
Tên mu v các giá trị số tơng ứng:

Tên hằng Mô tả Giá trị số
Black
Blue
Green
Cyan
Red
Margenta
Brown

LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMargenta
Yellow
White

Đen
Xanh
Xanh lá cây
Cốm thạch
Đỏ
Tía
Nâu
Xám nhạt
Xám đậm
Xanh nhạt
Xanh lá cây nhạt
Cẩm thạch nhạt
Đỏ nhạt
Tía nhạt
Vng
Trắng

0
1
2

3
4
5
6
7
8
9
10
11
12
13
14
15



3.1.2 Bảng mu Palette.
Bảng mu l tập hợp các mu ta có thể vẽ lên mn hình.
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 224
Lập trình bằng Turbo Pascal
Một bảng mu xác định bởi:
- Số lợng mu.
- Bộ những mu gì.
Ví dụ:
- Bảng mu CGA0 (bảng mu số 0 dùng cho mn hình CGA): có 4
mu. Các mu l: mu nền, LightGreen, LightRed, Yellow.
- Bảng mu CGA1 (bảng mu số 1 dùng cho mn hình CGA): có 4
mu. Các mu l: mu nền, LightCyan, LightMargenta, White.

Trong Unit Graph có định nghĩa sẵn kiểu Palette để thể hiện các thông

tin về bảng mu.

PaletteType = Record
size: byte;
colors: array [0 maxColor-1] of shortInt;
end;

Trong đó quy ớc mu nền l Palette.Colors[0], mu số 0 trong bộ mu.

SetAllPalette (var PaletteName);
Thay đổi sang một bảng mu mới.
SetPalette( N: word; Color: shortInt);
Đổi ô mu thứ N trong mảng mu của bảng mu sang mu mới.
GetPalette( Palette) ;
Ghi các giá trị của bảng mu đang dùng vo một cấu trúc kiểu
PaletteType.
SetColor( Color: word );
Đặt mu vẽ hiện tại
SetBkColor( Color: word) ;
Đặt mu nền.
GetMaxColor;
Hm trả về số lợng mu của chế độ đồ hoạ hiện tại (tức l giá trị của
biến MaxColor)

3.2 Các thủ tục về mẫu tô, mẫu nét vẽ
3.2.1 Các mẫu tô nền.
Các mẫu tô nền dùng trong các thủ tục GetFillSettings, SetFillStyle.

Tên hằng Giá trị Y nghĩa
EmptyFill

SolidFill
LineFill
0
1
2
Dùng mu nền
Dùng mu vẽ

Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 225
Lập trình bằng Turbo Pascal
LtSlashFill
SlashFill
BkSlashFill
LtBkSlashFill
HatchFill
XHatchFill
InterleaveFill
WideDotFill
CloseDotFill
UserFill
3
4
5
6
7
8
9
10
11
12


//////////
////////// (nét đậm hơn)
\\\\\\\\\\ (nét đậm hơn)
\\\\\\\\\\
lới ô vuông đứng #
lới ô chéo
lới đờng chéo dầy sít nhau
. . . . . .

Mẫu do ngời lập trình định
nghĩa bằng SetFillPatern


SetFillStyle(Pattern: Word; Color: Word);
Đặt mẫu tô v mu tô (bên trong một hình đóng kín).
Thủ tục ny xác định mẫu vẽ v mu tô bên trong hình vẽ bởi các thủ
tục FillPoly, Bar, Bar3D, PieSlice.
Có nhiều mẫu lm sẵn nh nêu trong bảng trên.
Nếu tham số cho SetFillStyle không hợp lệ thì GraphResult sẽ trả về
grError v Style hiện hnh không thay đổi.
Nếu Pattern = UserFill thì sẽ l dùng mẫu do ngời lập trình tự xây
dựng (xem thủ tục SetFillPattern)

Ví dụ.
uses Graph;
var
FillInfo: FillSettingsType;
begin
KhoiTaoDoHoa;

GetFillSettings(FillInfo);
{Ghi lu mẫu tô v mu tô hiện hnh}
Bar(0, 0, 50, 50);
SetFillStyle(XHatchFill, GetMaxColor);
{tô bằng mẫu mới, mu mới}
Bar(50, 0, 100, 50);
with FillInfo do
SetFillStyle(Pattern, Color);
{Khôi phục lại mẫu v mu tô lúc trớc}
Bar(100, 0, 150, 50);
Readln;
CloseGraph;
end.
3.2.2
Tự xây dựng mẫu tô nền

Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 226
Lập trình bằng Turbo Pascal
Mẫu nền UserFill nghĩa l mẫu nền do ngời lập trình tự xây dựng.
Ngời lập trình tự xây dựng mẫu nền, dùng kiểu FillPatternType đã đợc
định nghĩa sẵn trong Unit Graph nh sau:

Type
FillPatternType = array[1 8] of byte;

Mảng 8 byte sẽ cho ta một ma trận điểm 8 x 8. Ta có thể vẽ một mẫu
tuỳ ý bằng cách gán bit tại vị trí tơng ứng l 0 hay 1.
Ví dụ: mẫu vẽ chữ O.

1 1 $18

1 1 $24
1 1 1 1 $66
1 1 1 1 $66
1 1 1 1 $66
1 1 1 1 $66
1 1 $24
1 1 $18


SetFillPattern(Pattern: FillPatternType; Color: Word);
Đặt mẫu tô nền l mẫu nền tự xây dựng. Tham số Pattern l tên của
mảng 8 byte m ta vừa tự vẽ ở trên.
3.2.3 Ví dụ mẫu tô nền tự xây dựng.
Chơng trình dới đây sẽ tạo mẫu tô mới tên l Gray50. Gray50 l
mảng 8 * 8 bit, xen kẽ đều đặn 0 v 1, do đó có mu xám. Mẫu tô ny đợc
tô bên trong một hình chữ nhật.

uses Graph;
const
Gray50: FillPatternType = ($AA, $55, $AA, $55, $AA, $55,
$AA, $55);
var
OldPattern: FillPatternType;
begin
KhoiTaoDoHoa;

GetFillPattern(OldPattern); {Ghi lu mẫu tô cũ }
SetFillPattern(Gray50, White); {Đặt mẫu tô mới l
Gray50}
Bar(0, 0, 100, 100); {vẽ hình chữ nhật có tô bên trong}

ReadLn;
SetFillPattern(OldPattern,White);{Trả lại mẫu tô cũ}
Bar(0, 0, 100, 100);
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 227
Lập trình bằng Turbo Pascal
ReadLn;
CloseGraph;
End.

3.2.4
3.2.5
Một số thủ tục vẽ v tô nền bên trong đờng đóng kín

FillEllipse(X, Y: Integer; XRadius, YRadius: Word)
Vẽ v tô nền bên trong một hình ellipse.

FillPoly(NumPoints: Word; var PolyPoints);
Vẽ v tô mu đa giác. (So sánh với DrawPoly, không tô nền bên trong)
Đờng biên của đa giác đợc vẽ bằng nét vẽ, mu vẽ hiện hnh.

FloodFill(X, Y: Integer; Border: Word);
Tô mu một vùng kín bằng mẫu v mu tô hiện hnh.
(X, Y) l điểm mầm nằm trong vùng kín. Mẫu tô xác định bởi
SetFillStyle hay SetFillPattern. Mu tô l mu đờng biên. Nếu điểm
mầm nằm trong vùng thì vùng kín đợc tô mu đầy. Nếu trái lại, điểm
mầm nằm ngoi thì vùng ngoi đợc tô.
Các kiểu nét vẽ Line Style
Dùng trong các thủ tục GetLineSettings, SetLineStyle:

Tên hằng Giá trị số Y nghĩa

SolidLn
DottedLn
CenterLn
DashedLn
UserBitLn
0
1
2
3
4
Nét liền
Chấm chấm

Các vạch chéo
Do ngời lập trình tự
định nghiã.

Độ rộng của nét vẽ:
NormWidth = 1
ThickWidth = 3.

SetLineStyle(LineStyle: Word; Pattern: Word; Thickness: Word);
Thủ tục đặt kiểu nét vẽ.
Thủ tục ny sẽ đặt lại kiểu nét vẽ mới. Sau lệnh gọi thủ tục ny, các
kiểu nét vẽ dùng trong các thủ tục Line, LineTo, Rectangle, DrawPoly, Arc,
sẽ l kiểu nét vẽ mới.
Nếu gía trị tham số đầu vo không hợp lệ, GraphResult sẽ trả về
grError v kiêủ nét vẽ hiện tại không thay đổi.
Tham số Pattern không cần thiết, nếu dùng các kiểu nét vẽ đã lm sẵn.
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 228

Lập trình bằng Turbo Pascal
Trái lại, nếu dùng kiểu nét vẽ do ngời lập trình tự định nghĩa,
LineStyle = UserBitLn, thì tham số Pattern đợc thay bằng một giá trị số nhị
phân 16 bit, thể hiện mẫu nét vẽ do ngời lập trình tự xây dựng.
Ví dụ: Thay tham số Pattern bằng giá trị $AAAA có nghĩa l nét vẽ
mu xám vì $AAAA = 1010101010101010.

Ví dụ sử dụng kiểu nét vẽ.

uses Graph;
var
X1, Y1, X2, Y2: Integer;
begin
KhoiTaoDoHoa;
X1:= 10;
Y1:= 10;
X2:= 200;
Y2:= 150;
SetLineStyle(DottedLn, 0, NormWidth);
Rectangle(X1, Y1, X2, Y2);
SetLineStyle(UserBitLn, $C3, ThickWidth);
Rectangle(Pred(X1), Pred(Y1), Succ(X2), Succ(Y2));
Readln;
CloseGraph;
end.

3.3 ViewPort.

ViewPort l một khung nhìn hình chữ nhật, hạn chế các thao tác đồ
hoạ bên trong nó.


SetViewPort(X1, Y1, X2, Y2: Integer; Clip: Boolean);

Thủ tục ny sẽ thiết lập một khung nhìn - viewport (hay window cho
đồ hoạ).
(X1, Y1) l vị trí góc trên trái, (X2, Y2) l vị trí góc dới phải (0

X1 <
X2 , 0

Y1 < Y2). Toạ độ của góc trên trái sẽ trở thnh (0, 0).
Tham số Clip = false / true cho phép hoặc cấm việc vẽ ra ngoi
khung. Tuy nhiên vị trị của CP vẫn có thể vợt ra ngoaì khung. Có thể sử
dụng hai hằng ClipOn = True, ClipOff = false đã đợc định nghĩa sẵn.
Nếu tham số đầu vo không hợp lệ, GraphResult sẽ trả về một grError
v lệnh không có hiệu quả.
Các thủ tục InitGraph, GraphDefaults, SetGraphMode đều đặt lại
khung nhìn l ton bộ mn hình.
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 229
Lập trình bằng Turbo Pascal
Có thể lấy các giá trị tham số về viewport đang hiện hnh bằng cách
gọi thủ tục GetViewSettings. Giá trị trả về của thủ tục GetViewSettings l một
biến kiểu ViewPortType (chi tiết xem bên dới).

ClearViewPort;
Huỷ tác dụng của thủ tục đặt ViewPort trớc đó. ClearViewPort đặt
mu vẽ l mu nền (Palette[0]) v đa CP về điểm (0, 0) l góc trên
trái mn hình.

ClearDevice;

Xoá, lm sạch mn hình bằng mu nền xác định bởi SetBkColor v
đa CP về (0, 0).

GetViewSettings (var ViewPort: ViewPortType);
Lấy các tham số của ViewPort.
GetViewSettings trả về giá trị kiểu ViewPortType. Kiểu ViewPortType
đă đợc khai báo sẵn nh sau

ViewPortType = record
x1, y1, x2, y2: integer;
{x1,y1 v x2,y2 l toạ độ tuyệt đối}
Clip: Boolean;
end;

Các chơng trình con, nếu đặt lại ViewPort thì cần phải phục hồi lại
trạng thái cũ trớc khi kết thúc. Khuôn mẫu chung để thực hiện việc ny l

Var OldVp: ViewPortType;
Begin
GetViewSeting(OldVp );
SetViewPort(NewX1,NewY1,NewX2,NewY2, ClipOn );

With OldVp do SetViewPort(x1,y1,x2,y2, Clip);
End;

4.
Vẽ đồ thị một hàm số

Có hm số một biến y=f(x). Cần vẽ đồ thị hm số trong một khung
hình chữ nhật xác định

a

x

b , min = c

f(x)

d = max .

Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 230
Lập trình bằng Turbo Pascal
4.1 Phân tích thiết kế.

Việc vẽ một hình trên mn hình đồ hoạ đợc thực hiện bằng cách vẽ
từng điểm ảnh. Thực chất việc vẽ đồ thị hm số trên một hệ toạ độ Đề các
vuông góc cũng l chấm ra liên tục các điểm có toạ độ (x, f(x)). Có hai điểm
khác biệt cần lu ý l:
- Trên mn hình toạ độ y của điểm ảnh sẽ tăng lên khi di chuyển từ
trên xuống dới, ngợc với quy định của hệ toạ độ thông thờng.
- Toạ độ (0,0) trên mn hình ứng với điểm góc trên-trái, còn trong khi
vẽ đồ thị một hm số, gốc toạ độ (0,0) thờng l một điểm ở khoảng trung
tâm khung hình v các giá trị x,y có thể âm.
Cần thực hiện việc chuyển đổi từ toạ độ l giá trị số thực của x,y
thnh toạ độ số nguyên của điểm ảnh trên mn hình.

Giả sử ta vẽ đồ thị trong khung ViewPort nh trong hình vẽ dới đây.




(0,0) (Xpixel_max, 0)







(0, Ypixel_max) (Xpixel_max, Ypixel_max)

Hình 14.1: Khung ViewPort để vẽ đồ thị hm số.

Khi x biến thiên từ a đến b thì toạ độ điểm ảnh theo trục x m ta
gọi l Xpixel sẽ biến thiên từ 0 đến Xpixel_max. Do đó biến thiên giá trị
thực của x khi di chuyển trên trục x một điểm ảnh l
DeltaX = (b-a) / Xpixel_max.

Tơng tự, biến thiên giá trị của y khi di chuyển trên trục y một điểm
ảnh l
DeltaY = (d-c) / Ypixel_max.

Để vẽ ra các điểm trên mn hình có toạ độ (Xpixel, Ypixel) nằm trên
đồ thị của hm f(x) ta phải lm nh sau:
- Chuyển đổi Xpixel thnh giá trị thực của x,
- Tính y = f(x),
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 231
Lập trình bằng Turbo Pascal
- Chuyển giá trị thực của y thnh toạ độ Ypixel. Lu ý các toạ độ
điểm ảnh l số nguyên nên có thể phải lm tròn kết quả.
Cụ thể:

x:= a + Xpixel*DeltaX;
y:= f(x);
Ypixel:= Ypixel_max - Round(( y - c)/DeltaY);

4.2 Chơng trình chi tiết.

Chơng trình dới đây sẽ vẽ đồ thị của hm số y = exp (x) - 1. Giả sử
ta quan tâm đến phần đồ thị nằm trong khoảng a = -2 < x <3 = b. Giá trị y
của hm số sẽ biến thiên trong khoảng c = exp(-2) - 1 < y < exp(3) - 1 = d.

Y nghĩa của các biến nh sau:
Letrai, Lephai, Leduoi, Letren: l các số nguyên bằng độ rộng (số
điểm ảnh) của lề từ khung hình ViewPort cho đến các cạnh mn hình.
Xval_min = a; Yval_min = c ; Xval_max = b; Yval_max = d;
Xval, Yval: l toạ độ bằng giá trị số thực trên trục toạ độ của điểm đang
xét.
Xpixel, Ypixel: l toạ độ điểm ảnh để biểu diễn điểm đó trên mn hình.

uses crt,graph;
var

Letrai,Lephai,Leduoi,Letren, Xpixel_max, Ypixel_max:
word;
Xpixel,Ypixel, i, i_beg, i_end: integer;
Xval_min,Xval_max,Yval_min,Yval_max: real;
DeltaX, DeltaY, Xval,Yval: real;
Str3: String[3];

Procedure KhoiTaoDoHoa;
var Gd, Gm: integer;

begin Gd:= detect;
InitGraph(Gd, Gm,'C:\tp\BGI');
if graphresult <> grOk then halt(1);
end;
BEGIN
Letrai:= 50; Lephai:=50; Letren:=50; Leduoi:=50;

KhoiTaoDoHoa;
{ GetMaxX,GetMaxY sau khi da khoi tao do hoa }
Lephai:= GetmaxX - Lephai; Leduoi:= GetmaxY - Leduoi;
{ ve khung cua so }
Moveto(Letrai,Letren);
LineTo(Lephai,Letren);
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 232
LËp tr×nh b»ng Turbo Pascal
LineTo(Lephai,Leduoi);
LineTo(Letrai,Leduoi);
LineTo(Letrai,Letren);

SetViewPort(Letrai,Letren,Lephai,Leduoi,ClipOff);
Xpixel_max:= Lephai - LeTrai; Ypixel_max:= Leduoi -
Letren;

SetBkColor(LightBlue);
SetColor(LightGray);

Xval_min:= -2;
Xval_max:= 3;
Yval_min:= exp(-2)-1;
Yval_max:= exp( 3)-1;

DeltaX:= (Xval_max - Xval_min) / Xpixel_max ;
DeltaY:= (Yval_max - Yval_min) / Ypixel_max ;

{ ve duong cong do thi }
For i:= 0 to Xpixel_max do
begin Xpixel:= i;
Xval:= Xval_min + Xpixel*DeltaX;
Yval:= exp(Xval) - 1;
Ypixel:= Ypixel_max - Round((Yval -
Yval_min)/DeltaY);
Putpixel(Xpixel,Ypixel,white);
end;

{ ve truc toa do, neu nam trong khung }
if (Xval_min < 0) and (Xval_max > 0) then
begin
Xpixel:= Round((- Xval_min) / DeltaX);
MoveTo(Xpixel,Ypixel_max);
LineTo(Xpixel,0);
end;
if (Yval_min < 0) and (Yval_max > 0) then
begin
Ypixel:= Ypixel_max - Round((-
Yval_min)/DeltaY);
MoveTo(0,Ypixel);
LineTo(Xpixel_max,Ypixel);
end;

{ve cac vach chia tren khung}
i_beg:= trunc(Xval_min)+1;

i_end:= trunc(Xval_max);
for i:= i_beg to i_end do
begin Xpixel:= Round((i-Xval_min) / DeltaX);
Str(i, Str3);
OutTextXY(Xpixel,Ypixel_max+15,Str3);
NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 233
Lập trình bằng Turbo Pascal
MoveTo(Xpixel,Ypixel_max+5);
LineTo(Xpixel,Ypixel_max-5);
end;

i_beg:= trunc(Yval_min)-1;
i_end:= trunc(Yval_max);
for i:= i_beg to i_end do
begin
Ypixel:= Ypixel_max - Round((i-Yval_min)/DeltaY);
Str(i, Str3);
OutTextXY(-20,Ypixel,Str3);
MoveTo(-5,Ypixel);
LineTo(+5,Ypixel);
end;

repeat until KeyPressed;
closeGraph;
END.


4.3 Chuyển thành chơng trình con.

Vẽ đồ thị l một công việc hay gặp. Có thể chuyển chơng trình trên

thnh một thủ tục vẽ đồ thị để sử dụng lại sau ny. Nhận thấy rằng các dữ
liệu đầu vo để có thể vẽ đợc đồ thị một hm số l các giá trị a,b,c,d xác
định vùng đồ thị m ta quan tâm v quan trọng hơn l công thức tính giá trị
hm y=f(x). Nếu ta muốn vẽ chỉ trong khung hình ViewPort thì cần cung
cấp thêm độ rộng các lề bốn phía.
Hm cần vẽ đồ thị sẽ đợc gọi đến bên trong chơng trình con để tính
giá trị y. Do đó, cách đơn giản nhất l quy ớc dùng một tên gọi định sẵn, ví
dụ HamCanVeDoThi.


function HamCanVeDoThi(x:real):real;
begin

end;

procedure VeDoThi(Letrai, Lephai, Leduoi, Letren:word;
Xval_min,Xval_max,Yval_min,Yval_max: real);
var

Xpixel_max, Ypixel_max: word;
Xpixel,Ypixel, i, i_beg, i_end: integer;
DeltaX, DeltaY, Xval,Yval: real;
Str3: String[3];

begin

Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 234
Lập trình bằng Turbo Pascal
{ vẽ đờng cong đồ thị}
For i:= 0 to Xpixel_max do

Begin
Xpixel:= i;
Xval:= Xval_min + Xpixel*DeltaX;
Yval:=
HamCanVeDoThi
(Xval);
Ypixel:= Ypixel_max - Round((Yval -
Yval_min)/DeltaY);
Putpixel(Xpixel,Ypixel,white);
end;
repeat until KeyPressed;
end; { thủ tục vẽ đồ thị}

Trong thân chơng trình chính chỉ cần gọi thủ tục vẽ đồ thị với các
tham trị a,b,c,d thích hợp v các độ rộng lề mong muốn. Ví dụ

BEGIN
KhoiTaoDoHoa;

VeDoThi(50,50,50,50, a,b,c,d));
CloseGraph;
END.

5.
Làm hoạt hình.

Nguyên lí hoạt hình l hiển thị một dãy hình vẽ liên tiếp, lm cho
ngời xem có cảm giác nh hình vẽ chuyển động thực sự.
Có ba phơng pháp lm hoạt hình trên máy tính.
1- Vẽ-xoá-vẽ lại ra chỗ khác trên mn hình trơn.

2- Dùng GetImage v PutImage đặt hình ảnh tại vị trí mới.
3- Lật trang mn hình,

5.1 Di chuyển hình vẽ trên nền trơn

Mn hình trơn l mn hình chỉ có một mu nền. Khi cần tạo hình di
chuyển trên mn hình trơn có thể thực hiện đơn giản bằng cách sau:
1- vẽ hình,
2- xoá hình vừa vẽ bằng cách vẽ lại hình nhng bằng mu nền,
3- vẽ lại hình tại vị trí mới.

Lặp lại các bớc 2, 3 nhiều lần ta sẽ có hình chuyển động.
Ví dụ: hình vòng tròn lăn từ trái sang phải

uses crt,graph;
const radius = 50;
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 235
Lập trình bằng Turbo Pascal
step = 5;
Var x,y: integer;

Procedure KhoiTaoDoHoa;


procedure DrawBall(color:word);
begin
setColor(color);
circle(x,y,radius);
end;
BEGIN

KhoiTaoDoHoa;

x:=radius;
y:=GetmaxY div 2;

repeat
DrawBall(Black);
x:=x+step;
DrawBall(white);
delay(100);
until keyPressed OR (x>GetmaxX - radius - step);
readln;
closegraph;
END.
5.2 Di chuyển hình vẽ trên nền hình ảnh tĩnh.
5.2.1 Các thủ tục hỗ trợ
Unit Graph cung cấp các hm, thủ tục thao tác với một vùng hình chữ
nhật các điểm ảnh. Ta cần tìm hiểu chúng trớc khi thực hiện việc chuyển
động hình ảnh trên nền hình ảnh khác.

GetImage(X1, Y1, X2, Y2: Integer; var BitMap);
Ghi lu lại một vùng hình chữ nhật của mn hình đồ hoạ vo bộ đệm.
X1, Y1, X2, Y2 xác định khung hình ch nhật. BitMap l một biến động,
không định kiểu, nhằm xác định một vùng nhớ cần thiết để chứa vùng hình.
Hai word đầu tiên của BitMap ghi chiều rộng, chiều cao của vùng hình tính
theo pixel. word thứ ba dnh riêng. Phần còn lại của BitMap chứa nội dung
của vùng hình theo từng bit. Kích thớc (theo byte) của vùng hình xác định
bằng hm ImageSize. Phần bộ nhớ dnh ghi lu vùng hình không đợc vợt
quá 64K.


ImageSize(X1, Y1, X2, Y2: Integer): Word;
Lấy kích thớc (theo byte) của vùng ảnh hình chữ nhật.
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 236
Lập trình bằng Turbo Pascal
X1, Y1, X2, Y2 l các toạ độ xác định hình chữ nhật. ImageSize cho biết
số byte cần thiết để thủ tục GetImage có thể ghi lu vùng ảnh. Kích thớc
ny đã bao gồm cả 3 word chứa chiều rộng, chiều cao v dnh riêng.
Nếu thiếu bộ nhớ (kích thớc > 64K) thì giá trị trả về l 0 v
GraphResult cho mã lỗi grError l -11.

PutImage(X, Y: Integer; var BitMap; BitBlt: Word);
Hiển thi một hình bitmap ra mn hình.
(X, Y) l toạ độ góc trên trái của khung hình chữ nhật. BitMap l tham
biến, không định kiểu chứa dữ liệu về vùng ảnh sẽ in ra mn hình nh đã mô
tả trong thủ tục GetImage. Hình ảnh sẽ đợc hiển thị ra mn hình theo từng
bit, dùng phép toán BitBlt để kết hợp với điểm ảnh đang có trên mn hình:

Bảng toán tử BitBlt.

Tên hằng Giá
trị
Y nghĩa
NormalPut
CopyPut
XORPut
OrPut
AndPut
NotPut
0
0

1
2
3
4
MOV
MOV
XOR
OR
AND
NOT

Vậy các phép toán bit trên có nghĩa l
- NormalPut, CopyPut l viết đè lên bit đang có trên mn hình.
- XORPut, kết hợp XOR từng cặp bit cũ với bit mới.
- ORPut, kết hợp OR từng cặp bit cũ với bit mới.
- AndPut, kết hợp AND từng cặp bit cũ với bit mới.
- NotPut, đảo ngợc bit hình ảnh rồi mới xuất ra.

5.2.2 Cách thức di chuyển một hình trên nền hình ảnh tĩnh.
XORPut chính l phép toán sẽ dùng trong kĩ thuật hoạt hình để di
chuyển một hình trên mn hình đã có hình vẽ nền.
Lí do sẽ đợc giải thích
qua bảng dới đây.

N M R=N xor M R M R xor M=N
0 0 0 0 0 0
0 1 1 1 1 0
1 0 1 1 0 1
1 1 0 0 1 1


Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 237
Lập trình bằng Turbo Pascal
Một điểm ảnh có mu xác định bởi một số bit (ví dụ 4 bit thì đợc 16
mu). Giả sử mu nền l N. Ta dùng phép XOR vơí một mu khác l M nhận
đợc mu kết quả l R = N XOR M. Bảng trên nói rằng nếu bây giờ lại thực
hiện R XOR M ta nhận lại đợc N. Đây chính cái ta cần khi lm hoạt hình
trên một nền hình ảnh tĩnh khác vì khi vẽ phần hình chuyển động ra chỗ khác
thì cần khôi phục lại phần hình ảnh nền đã bị đè lên.
Các bớc thực hiện hoạt hình:
1- Dùng GetMem xin cấp phát một vùng nhớ v GetImage để lu hình
ảnh cần di chuyển vo đây.
2- Dùng PutImage với XOR để vẽ ra mn hình
3- Dùng PutImage với XOR để hiện lại vùng hình cũ.
Lặp lại các bớc 2,3 tại các vị trí khác nhau ta sẽ có hình chuyển động
trên nền ảnh tĩnh.
5.2.3 Ví dụ minh hoạ.
Vẽ đĩa bay di chuyển ngẫu nhiên trên nền trời sao.
Phân tích: Đây l bi toán lm hoạt hình trên nền hình ảnh tĩnh. Hình
ảnh cần di chuyển l một elíp có tô nền mô phỏng một đĩa bay. Theo các
bớc ở trên, chơng trình gồm các thủ tục chính sau đây.

1- TaoHinhDiaBay: Thủ tục thực hiện việc vẽ một hình elíp tô mu đặc bên
trong tại góc trên trái của mn hình. Elíp có hai bán trục l Xradius,
Yradius do đó có tâm tại điểm (Xradius, Yradius) v chiều rộng,
chiều cao của khung hình chữ nhật chứa trọn nó l Rong = 2*Xradius,
Cao = 2* Yradius. Sau đó khung hình ny đợc ghi vo vùng nhớ trỏ
bởi imgPtr.
2- DiChuyên: Thủ tục tiến hnh gán ngẫu nhiên giá trị mới cho toạ độ của
điểm (X,Y) l góc trên trái của khung hình cần di chuyển. Đây l điểm
mốc để các thủ tục PutImage vẽ khung hình ra mn hình.

3- HoatHinh Thủ tục lặp lại nhiều lần các bớc 2,3 trong quy trình thực
hiện hoạt hình nói trong phần trên. Xen kẽ với việc gọi thủ tục
DiChuyên để có hình đĩa bay chuyển động ngẫu nhiên trên mn hình.

Chơng trình chi tiêt nh sau.

uses crt,graph;
const Xradius = 24; Yradius = 8;
Var Gd,Gm: integer;
maxX,maxY: integer;
CurPort: ViewPortType;

X,Y: integer;
Rong, Cao, kt: word;
VungAnhPtr: pointer;

Procedure KhoiTaoDoHoa;
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 238
LËp tr×nh b»ng Turbo Pascal


procedure VeBauTroiSao;
var i: integer;
begin
SetBkColor(Blue);
for i:= 1 to 1000 do
putPixel(Random(maxX), Random(maxY),
random(getmaxcolor)+1);
end;


procedure DiChuyen( var X,Y: integer; Width, Height: word);
var step: integer;
begin
step:=random(Width);
if Odd(step) then step:= -step;
x:=x+step;
step:=random(Height);
if Odd(step) then step:= - step;
Y:= Y+step;

With CurPort do
begin
if (x1 + X + Width -1 > x2) then
X:= x2-x1 - Width +1
else if (X<0) then X:= 0;
if (y1 + Y + Height -1 > y2) then
Y:= y2-y1 - height + 1
else if (Y<0) then Y:=0;
end;
end; {DiChuyen}

procedure TaoHinhDiaBay( var imgPtr: pointer);
{ve hinh dia bay va chep vao bo nho}
var TamX, TamY: integer;

begin
TamX:= Xradius;
TamY:= Yradius;
SetFillStyle(SolidFill,GetMaxColor);
FillEllipse(TamX, TamY, Xradius, Yradius);


{doc anh dia bay vao bo nho}
Rong:= 2*Xradius;
Cao:= 2*Yradius;
kt:= ImageSize(0,0,Rong,Cao);
GetMem(imgPtr, kt);
GetImage(0,0,Rong,Cao, imgPtr^);
{ xoa hinh dia bay ve tam tren goc}
putImage(0,0,imgptr^,XorPut);
end;

procedure HoatHinh( Width, Height, PauseTime: word; imgPtr:
Pointer);
{di chuyen dia bay ngau nhien tren man hinh}
begin
NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 239
Lập trình bằng Turbo Pascal
Repeat
putImage(X,Y,imgPtr^,XorPut);
Delay(Pausetime);
putImage(X,Y,imgPtr^,XorPut);
DiChuyen(X,Y,Width,Height);
until keypressed;
freeMem(imgPtr,kt);
end; {HoatHinh}

BEGIN
KhoiTaoDoHoa;
MaxX:=GetMaxX;
MaxY:=GetMaxY;

ClearDevice;
SetViewPort(0,0,maxX, maxY, ClipOn);
GetViewSettings(CurPort);
randomize;
X:= MaxX div 2;
Y:= MaxY div 2;
VeBauTroiSao;
TaoHinhDiaBay(VungAnhPtr);
HoatHinh(Rong,Cao,70, VungAnhPtr);

Readln;
CloseGraph;
END.


5.3 Sử dụng phép lật trang màn hình.

Nội dung của một trang mn hình đợc ghi vo một vùng nhớ liên tục.
Nếu chế độ đồ hoạ hỗ trợ nhiều trang mn hình, ta có thể tạo hoạt hình bằng
cách luân phiên xuất một trang ra mn hình, vẽ hình tiếp theo vo một trang
khác sau đó đổi vai trò cho nhau.
5.3.1 Các thủ tục hỗ trợ

SetActivePage(Page: Word);
Đặt trang đồ hoạ thnh active (trang chuẩn bị xuất ra mn hình).
Các trình điều khiển hiẻn thị mn hình hỗ trợ nhiều trang nh EGA
(256K), VGA, Hercules cho phép chuẩn bị dữ liệu cho một trang mn hình
ở chế độ đợi hiển thị (offscreen), sau đó hiển thị nhanh chóng bằng cách
chuyển nó thnh trang đang hiển thị (visual page).
Nh vậy, sau lệnh SetActivePage các thủ tục đồ hoạ vẽ, viết l thực

hiện trên trang ny. Sau khi chuẩn bị xong nội dung của trang thì mới cho
hiển thị thực sự ra mn hình bằng SetVisualPage.

SetVisualPage(Page: Word);
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 240
Lập trình bằng Turbo Pascal
Hiện trang mn hình Page đã đợc chuẩn bị sẵn.

5.3.2
5.3.3
Cách lm hoạt hình bằng lật trang.
1- Gọi thủ tục SetActivePage cho trang số 0 v sau đó dùng các thủ
tục đồ hoạ vẽ hình trên trang ny.
2- Cho hiển thị bằng SetVisualPage.
3- Tráo đổi số trang (lật trang) thnh trang số 1 v lặp lại hai bớc
trên.

Ví dụ minh hoạ
Vẽ hình đôi mắt nhìn qua lại.

uses crt,graph;
Var Page: word;

Procedure KhoiTaoDoHoa;


procedure DrawEye(Mode: word);
var DeltaX: integer;
begin
SetColor(White);

SetFillStyle(1,White);
Sector(x,y,0,360,20,10);
{mat trai=hinh Ellipse mau trang}
Sector(x+100,y,0,360,20,10); {mat phai}
SetFillStyle(1,Blue);
SetColor(Blue);
Case Mode of
0: DeltaX:=-5;
1: DeltaX:=5;
end;
Sector(x+DeltaX,y,0,360,10,10);
{con nguoi= hinh tron mau xanh}
Sector(x+DeltaX+100,y,0,360,10,10);
end;

BEGIN
KhoiTaoDoHoa;

x:= GetMaxX div 2 -50;
y:= GetMaxY div 2;
Page:=0;
While not Keypressed do
begin
SetActivePage(Page);
Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 241

×