PHỤ CHƯƠNG ÐỒ HỌA TRONG TURBO PASCAL
Phần này chỉ nhằm giới thiệu một số các khái niệm cơ bản về chế độ đồ họa,
các thủ tục và hàm để: khởi động chế độ đồ họa, vẽ các hình cơ bản như đường
thẳng, đường tròn, cung elip, hình quạt, đa giác, chuỗ
PHỤ CHƯƠNG ÐỒ HỌA TRONG TURBO PASCAL
I. KHÁI NIỆM VỀ ĐỒ HỌA.
II. KHỞI ĐỘNG CHẾ ĐỘ ĐỒ HỌA.
III. LỔI ĐỒ HỌA.
IV. MỘT SỐ HÀM VÀ THỦ TỤC CHUẨN TRONG UNIT GRAPH.
1. Màu và mẩu(kiểu).
2. Điểm, kiểu đường thẳng, đường thẳng.
3. Các hình không tô.
4. Các hình có tô.
5. Xử lý chuỗi ký tự trên màn hình đồ họa.
6. Cửa sổ trong chế độ đồ họa.
7. Đóng chế độ đồ họa.
V. MỘT VÀI VÍ DỤ MINH HỌA.
Phần này chỉ nhằm giới thiệu một số các khái niệm cơ bản về chế độ đồ họa,
các thủ tục và hàm để: khởi động chế độ đồ họa, vẽ các hình cơ bản nh ư đ ường
thẳng, đường tròn, cung elip, hình quạt, đa giác, chuỗi ký tự, c ửa sổ ViewPort,... đã
được khai báo sẵn trong Unit Graph của Turbo Pascal.
I. KHÁI NIỆM VỀ ÐỒ HỌA
Trong Turbo Pascal có hai chế độ thường được sử dụng đó là: chế độ văn bản
(text mode) và chế độ đồ họa (graphics mode). Chế độ văn bản thì màn hình đ ược
thiết lập hiển thị 25 dòng và 80 cột như đã giới thiệu ở phần trước. Còn ở chế độ đồ
họa, thì màn hình lại được thiết lập dựa trên từng đi ểm ảnh (pixel), m ỗi màn hình
gồm nhiều điểm ảnh được sắp xếp trên các đường thẳng n ằm ngang và đường th ẳng
đứng, sự bài trí số pixel trên mỗi loại màn hình được gọi là độ phân gi ải (Resolution),
độ phân giải càng cao thì số pixel càng nhiều và hình ảnh càng mịn.
Hệ tọa độ cho mỗi loại màn hình có khác nhau (xem bảng 1), chẳng hạn ở lo ại
màn hình VGA là 640x480 như hình sau:
Một chương trình đồ họa thường gồm các phần sau:
· Khởi tạo chế độ đồ họa.
· Xác định màu nền, màu và kiểu chữ, màu đường vẽ, màu tô và kiểu tô.
· Vẽ và tô các hình ta cần thực hiện.
· Các thao tác khác như cho hiện dòng chữ, chú thích.
· Ðóng chế độ đồ họa để trở về chế độ văn bản.
II. KHỞI ÐỘNG CHẾ ÐỘ ÐỒ HỌA
Ðể có thể thực hiện chương trình trên chế độ đồ họa, trước tiên ta phải kh ởi
động chế độ đồ họa. Việc này được thông qua thủ tục sau:
Procedure InitGraph(var GraphDriver:Integer; var GraphMode: Integer; PathToDriver:
string);
Với: GraphDriver, GraphMode là loại màn hình và mốt màn hình (xem bảng 1).
PathToDriver là đường dẫn của thư mục chứa các tập tin điều khiển đồ họa.
Ví dụ: Giả sử ta có loại màn hình VGA, mốt là VGAHi, các tập tin đi ều khi ển đ ồ h ọa
ở trong thư mục F:\WINAPPS\BP\BGI, ta có thể vi ết phần ch ương trình kh ởi đ ộng đ ồ
họa như sau:
Uses Graph;
Var mh,mode: integer; {mh: loại màn hình}
Begin
mh:=VGA; mode:=VGAHi; {có thể dùng hằng DETECT cho mh } (1)
Initgraph(mh,mode,’ F:\WINAPPS\BP\BGI’);
...........
End.
Việc nhớ các loại màn hình và mốt màn hình là điều gây dễ nhầm lẫn, do vậy
ta có thể để cho máy tự động dò tìm lo ại và m ốt màn hình. Nh ư v ậy ở chương trình
trên ta bỏ dòng (1) thì khi thực hiện máy sẽ tự động dò tìm (DECTECT), đây là đi ểm
rất hay vì nó sẽ cho khởi động loại màn hình đang sử d ụng và m ốt đ ồ h ọa có đ ộ phân
giải cao nhất.
Bảng 1: Các giá trị của Grapdriver, GraphMode và Resolution của một số lo ại
màn hình thông dụng.
GraphDriver GraphMode Resolution
DETECT (0) Ðộ phân giải cao nhất và loại màn hình sử
dụng
CGA (1) CGAC0 (0) 320 x 200
CGAC1 (1) 320 x 200
CGAC2 (2) 320 x 200
CGAC3 (3) 320 x 200
CGACHi (4) 640 x 200
EGA (3) EGALo (0) 640 x 200
EGAHi (1) 640 x3 50
VGA (9) VGALo (0) 640 x 200
VGAMed (1) 640 x 350
VGAHi (2) 640 x 480
Chú ý: Ở bảng này các hằng DETECT có giá trị 0, hằng VGA có giá trị 9, hằng
VGAHi
có giá trị 2, ...
Ta có thể xác định Grapdriver, GraphMode và Resolution trên một máy đang
hoạt động bằng chương trình sau:
Uses Graph;
Var mh,mode:integer;
Begin
mh:=Detect; {Có thể bỏ dòng này}
initgraph(mh,mode,'f:\winapps\bp\bgi');
writeln('GraphDriver = ',mh,' Graphmode = ',mode,' Resolution =',GetmaxX,
'x',GetMaxY);
readln;
closegraph;
End.
Với: GetmaxX, và GetMaxY là các hàm trả về giá trị lớn nhất t ương ứng cho
hàng, cột của màn hình và mốt hiện hành.
III. LỖI ÐỒ HỌA
Khi khởi động đồ họa, nếu máy không tìm thấy các chương trình điều khiển
đồ họa thì sẽ phát sinh ra lỗi đồ họa và như vậy chương trình không th ể th ực hi ện
được hoặc có thể treo máy.
Trong cả 2 trường hợp có hoặc không có lỗi, ta nên sử d ụng hàm GraphResult
để biết có lỗi hay không? Có thể kết hợp với hàm GraphErrorMsg đ ể nhận đ ược
thông báo đúng nhất. Bảng 2 liệt kê một số thông báo lỗi thường gặp:
Bảng 2: Các lỗi đồ họa
Hằng Trị mã Thông tin lỗi phát hiện
lỗi
GrOk 0 Không có lỗi khởi động đồ họa.
GrNoInitgraph -1 Chưa khởi động dồ họa.
GrNotDetected -2 Không có phần cứng đồ họa.
GrFileNotFound -3 Không tìm thấy trình điều khiển đồ họa.
GrInvalidDriver -4 Trình điều khiển không hợp lệ.
GrNoloadMem -5 Không đủ bộ nhớ RAM cho đồ họa.
GrNoScanMem -6 Tràn vùng nhớ trong Scan Fill.
GRNoFloodMem -7 Tràn vùng nhớ trong Flood Fill.
GrFontNoFound -8 Không tìm thấy tập tin Font.
GrNoFontMem -9 Không đủ bộ nhớ RAM để nạp Font.
GrInvalidMode -10 Kiểu đồ họa không hợp lệ cho trình điều
khiển.
GrError -11
Lỗi đồ họa tổng quát.
GrIOError -12
Lỗi đồ họa vào ra.
GrInvalidFont -13
Tập tin Font không hợp lệ.
GrInvalidFontNum -14
Số hiệu đại diện cho Font không hợp lệ.
Ví dụ: Chương trình kiểm tra quá trình khởi động đồ họa và n ếu có lỗi
sẽ thông báo lỗi ra màn hình:
Uses Graph;
Var
maloi: Integer;
GrDriver, GrMode: Integer;
Begin
GrDriver := Detect;
InitGraph(GrDriver, GrMode, 'f:\winapps\bp\bgi');
maloi := GraphResult; { Check for errors }
if maloi grOk then
begin
Writeln('Lỗi đồ họa là : ', GraphErrorMsg(maloi));
Writeln('Lỗi!, Thoát khỏi chương trình ...');
Halt(1); {Lệnh ngắt ngang và kết thúc chương trình }
end
else { Phần chương trình cần thực hiện khi không có lỗi đồ họa }
End.
IV. MỘT SỐ HÀM VÀ THỦ TỤC CHUẨN TRONG UNIT GRAPH
1. Mầu và mẫu (kiểu)
Ðối với màn hình trắng đen (Hercules Monochrome) ta có 2 giá tr ị màu 0 và 1,
còn đối với các màn hình màu (VGA, EGA,...) thì có 16 giá tr ị màu t ừ 0..15 đ ược li ệt
kê trong bảng 3, và kiểu tô màu thì có 11 kiểu đã được định sẵn là từ 0..11 và một kiểu
do người lập trình định nghĩa (User - defined fill) và các kiểu tô đ ược li ệt kê trong
bảng 4.
a. Thủ tục chọn màu đường vẽ
SetColor(ColorNum:word);
b. Thủ tục đặt màu nền của màn hình
SetBkColor(ColorNum :word);
c. Thủ tục chọn kiểu tô và màu tô
SetFillStyle(Pattern:word; ColorNum:word);
d. Hàm nhận màu trả về do thủ tục SetColor đã đặt màu trước đó
GetColor: word;
e. Hàm nhận màu nền trả về do thủ tục SetBkColor đã đặt trước đó
GetBkColor: word;
f. Hàm trả về giá trị màu lớn nhất
GetMaxColor: word;
Bảng 3: Các giá trị có thể nhận của biến màu ColorNum
Tên hằng Giá trị màu Màu hiển thị
Black 0 Ðen
1
Blue Xanh da trời
2
Green Xanh lá cây
3
Cyan Xanh lơ
4
Red Ðỏ
5
Magenta Tím
6
Brown Nâu
7
LightGray Xám nhạt
8
DarkGray Xám sẫm
9
LightBlue Xanh da trời nhạt
10
LightGreen Xanh lá cây nhạt
11
LightCyan Xanh lơ nhạt
12
LightRed Ðỏ nhạt
13
LightMagenta Tím nhạt
14
Yellow Vàng
15
White Trắng
Bảng 4: Các giá trị có thể nhận của biến kiểu tô Pattern
Tên hằng Giá trị kiểu Diễn giải kiểu tô
tô
EmptyFill 0 Tô bằng màu nền
SolidFill 1 Tô đặc
LineFill 2 Tô bằng gạch ngang
LtSlashFill 3 Tô bằng ///
SlashFill 4 Tô bằng /// in đậm
BkSlashFill 5 Tô bằng \\\ in đậm
LtBkSlashFill 6 Tô bằng \\\
HatchFill 7 Tô bằng đường gạch bóng nhạt
XHatchFill 8 Tô bằng đường gạch bóng chữ thập
InterleaveFill 9 Tô bằng đường đứt quãng
WideDotFill 10 Tô bằng những dấu chấm thưa
CloseDotFill 11 Tô bằng dấu chấm dày
UserFill 12 Mẫu tô tự tạo
2. Ðiểm, kiểu đường thẳng, đường thẳng
a. Thủ tục vẽ một điểm tại một tọa độ (x,y)
PutPixel(x,y:integer;ColorNum:word);
b. Thủ tục chọn kiểu đường thẳng
SetLineStype(linestyle:word;pattern:word;thickness:word);
Với tham số LineStyle có các giá trị như bảng 5 sau:
Bảng 5: Tham số LineStyle
Hằng Giá trị Diễn giải
SolidLn 0 Nét đậm
DottedLn 1 Nét chấm
CenterLn 2 Nét chấm gạch
DashedLn 3 Nét gạch
UserBitLn 4 Mẫu tự tạo
Với tham số thickness có các giá trị như bảng 6 sau:
Bảng 6: Tham số Thickness
Hằng Giá trị Diễn giải
NormWidth 1 Bề dày bình thường
ThickWidth 3 Bề dày đậm
c. Thủ tục vẽ đường thẳng từ tọa độ (x1 ,y1) đến tọa độ (x2 ,y2)
Line(x1 ,y1 ,x2 ,y2: integer);
3. Các hình không tô
a. Thủ tục vẽ hình chữ nhật
Rectangle(x1 ,y1 ,x2 ,y2:integer);
b. Thủ tục vẽ hình tròn
Circle(x,y:integer;r:word);
Với x,y là tọa độ tâm, r là bán kính.
c. Thủ tục vẽ một cung tròn
Arc(x,y:integer; StAngle,EndAngle:word; r :word);
Với StAngle là góc bắt đầu, EndAngle là góc kết thúc.
d. Thủ tục vẽ cung Ellipse hoặc một Ellipse
Ellipse(x,y:integer;StAngle,EndAngle:word;Xradius,Yradius:word);
Nếu StAngle = 0 và EndAngle =360 thì là một hình Ellipse, n ếu
EndAngle < 360 thì là một cung Ellipse.
4. Các hình có tô
a. Ðường gấp khúc (đa giác)
Muốn vẽ một đường gấp khúc đi qua n điểm tọa độ : (x1 ,y1), (x2 ,y2),...,
(xn ,yn ) thì ta phải đưa tạo độ n điểm này vào một m ảng poly nào đó mà m ỗi ph ần t ử
của mảng có kiểu PointType đã được định nghĩa sẵn như sau:
Type
PointType = Record
x,y : integer;
end;
Khi điểm cuối (xn ,yn ) có tọa độ trùng với đi ểm đầu (x1 ,y1 ) thì n đi ểm này
sẽ tạo thành một đường gấp khúc khép kín.
Dùng thủ tục DrawPoly(n, poly); để vẽ đường gấp khúc đi qua n tọa độ đã định
sẵn trong mảng poly.
Dùng thủ tục FillPoly(n,poly); để vẽ và tô đường gấp khúc đi qua n t ọa đ ộ đã
định sẵn trong mảng poly.
Ví dụ:
Uses Graph;
Const
gk: Array[1..3] of pointtype=((x:5;y:200),(x:190;y:5),(x:100;y:300)); {gấp khúc}
gkkk: Array[1..4] of Pointtype = ((x:405;y:200),(x:590;y:5),(x:500;y:300),(x:405;y:200));
Var Gd, Gm: Integer;
Begin
Gd := Detect;
InitGraph(Gd, Gm, 'F:\WINAPPS\BP\BGI');
if GraphResult grOk then Halt(1);
SetBkcolor(CYAN);
SetColor(YELLOW);
SetFillStyle(SolidFill,MAGENTA);
DrawPoly(3,gk);
FillPoly(3,gk); {đường gấp khúc không khép kín}
FillPoly(4,gkkk); {đường gấp khúc khép kín}
Readln;
CloseGraph;
End.
b. Thủ tục vẽ hình chữ nhật
Bar(x1 ,y1 ,x2 ,y2: integer);
c. Thủ tục vẽ hình hộp chữ nhật
Bar3D(x1 ,y1 ,x2 ,y2:integer; depth:word;top:boolean);
Tham số depth: là số điểm trên bề sâu của khối 3 chiều.
Tham số top có 2 giá trị được định nghã sẵn là: TopOn (True) tương ứng
khối 3 chiều sẽ có nắp và TopOff (False) sẽ ứng với khối 3 chi ều không có n ắp (xem
hình vẽ).
d. Thủ tục vẽ hình Ellipse
FillEllipse(x,y:integer;xradius,yradius:word);
e. Thủ tục vẽ hình quạt
PieSlice(x,y:integer; StAngle,EndAngle,radius:word);
5. Xử lý chuỗi ký tự trên màn hình đồ họa
a. Thủ tục nạp Font chữ
Các font chữ nằm trong các tập tin có phần mở rộng là .CHR . Ð ể n ạp các
font chữ này ta dùng thủ tục:
SetTextStyle(font,direction,charsize:word);
Với: Tham số font có thể nhận một trong các giá trị sau:
Hằng DefauFont hay giá trị 0
Hằng TriplexFont hay giá trị 1
Hằng SmallFont hay giá trị 2
Hằng SansSerifFont hay giá trị 3
Hằng GothicFont hay giá trị 4
Tham số direction có thể nhận một trong các giá trị sau:
Hằng HorizDir hay giá trị 0
Hằng VertDir hay giá trị 1
Tham số charsize là cỡ ký tự và nó có thể nhận m ột trong các giá tr ị t ừ 1 đ ến
10.
b. Thủ tục đặt chế độ căn chỉnh chuỗi văn bản
SetTextJustify(horiz, vert :word);
Trong đó:
Tham số horiz có thể là một trong các hằng: LeftText, CenterText, RightText.
Tham số vert có thể là một trong các hằng: BottomText, CenterText, TopText.
c. Thủ tục hiển thị chuỗi văn bản tại vị trí con nháy
OutText (text:string);
d. Thủ tục hiển thị chuỗi văn bản tại tọa độ (x,y)
OutTextXY (x,y:integer;text:string);
6. Cửa sổ trong chế độ đồ họa (ViewPort)
Ðể thiết lập một cửa sổ trên màn hình đồ họa, ta sử dụng đến ch ức năng c ủa
ViewPort. Cửa sổ ViewPort được xem như một vùng chữ nhật trên màn hình đ ộ h ọa,
nó giống như thủ tục Window trong chế độ văn bản (Text mode), nghĩa là ta có th ể
hiện một dòng văn bản, vẽ hình hoặc xóa chỉ nằm gọn trong ViewPort đã đ ịnh, ta có
thể minh họa một cửa sổ ViewPort như hình sau:
Ðể hiểu rõ cách thiết lập một ViewPort, ta hãy xét đến cách khai báo kiểu của
ViewPort như sau:
ViewPortType = Record
x1, y1, x2, y2 : Integer;
Clip : Boolean;
End;
Trong đó: (x1, y1) , (x2, y2) lần lượt là góc tọa độ trên bên trái và t ọa đ ộ góc
dưới bên phải, mà chúng phải thỏa tính chất sau:
Clip là một biến trường có kiểu Boolean mà nó có ý nghĩa như sau:
· Nếu có giá trị bằng True (hay bằng hằng ClipOn) thì không cho phép v ẽ bên ngoài
ViewPort.
· Nếu có giá trị bằng False (hay bằng hằng ClipOff) thì cho phép v ẽ bên ngoài
ViewPort.
a. Thủ tục thiết lập một ViewPort
SetViewPort(x1,y1,x2,y2:integer; Clip:Boolean);
Sau khi thiết lập ViewPort ta sẽ có một hệ tọa độ m ới mà góc trên bên trái c ủa
ViewPort sẽ có tọa độ (0,0).
Ví dụ: Như hình vẽ ở trên (giả sử ta chọn Clip bằng hằng ClipOn) thì ta ph ải thi ết
lập ViewPort như sau: SetViewPort(300,250,500,350,ClipOn);
* Tọa độ âm dương
Với một số đồ thị của toán học phải có tọa độ âm dương, để vẽ nó ta phải
chia màn hình ra làm 4 phần tương ứng với 4 vùng (I, II, III, IV) âm dương c ủa một hệ
trục tọa độ xy. Ðể thực hiện việc này, ta phải dùng đến c ửa sổ ViewPort, v ới cách
thiết lập sao cho tọa độ (0,0) của trục tọa độ xy là tâm tuyệt đối của màn hình góc trên
bên trái của ViewPort như sau:
- Ðặt: x1= GetmaxX; y1= GetmaxX;
x2= GetmaxX; y2= GetmaxX;
- Dùng thủ tục SetViewPort(x1,y1,x2,y2,ClipOff) , với Clip = ClipOff đ ể
có thể vẽ ra ngoài giới hạn của ViewPort.
Ví dụ:
Vẽ đồ thị hàm sin(x) trong hệ trục tọa độ âm dương, với hoành độ
Program Dothi;
Uses Crt,Graph;
Const
ScaleX=20;
ScaleY=80;
Var mh,mode,x,y,i:integer;
Begin
InitGraph(mh,mode,'F:\WINAPPS\BP\BGI');
SetViewPort(GetmaxX DIV 2,GetmaxY DIV
2,GetmaxX,GetmaxY,ClipOff);
SetColor(blue);
Line(-(GetmaxX DIV 2),0,GetmaxX DIV 2,0);
Line(0,-(GetmaxY DIV 2),0,GetmaxY DIV 2);
SetTextJustify(CenterText,CenterText);
SetColor(White);
OutTextXY(-GetmaxX DIV 4,-GetmaxX DIV 4,'DO THI HINH SIN ');
SetColor(Red);
OutTextXY(GetmaxX DIV 2- 32,2,'Truc x >');
OutTextXY(27,-(GetmaxY DIV 2-5),'^ Truc y');
OutTextXY(0,0,'0,0');
for i:= -400 to 400 do
begin
x:=Round(2*Pi*i* ScaleX /200);
y:=Round(Sin(2*Pi*i/200)* ScaleY);
PutPixel(x,y,Yellow);
end;
Repeat Until KeyPressed;
CloseGraph;
End.
b. Thủ tục nhận ViewPort hiện hành
GetViewSettings(Var ViewPort: ViewPortType);
c. Thủ tục xóa bên trong màn hình ViewPort hiện hành
ClearViewPort;
Thủ tục xóa sạch tất cả các phần (hình vẽ, chuỗi ký tự, ...) bên trong ViewPort
và đưa con trỏ về tọa độ (0,0) của cửa sổ ViewPort hiện hành.
d. Thủ tục xóa sạch màn hình đồ họa
ClearDevice;
7. Ðóng chế độ đồ họa
Ðể trở về chế độ văn bản, ta dùng thủ tục:
CloseGraph;
V. MỘT VÀI VÍ DỤ MINH HỌA
Ví dụ 1: Vẽ Bầu trời đầy sao
PROGRAM Vebautroi;
Uses Graph,Crt;
Var gd,gm,x,y:integer; maxcolor:word;
Begin
Gd:=Detect;
Initgraph(gd,gm,'C:\TP70\BGI');
If Graphresult Grok Then Halt(1);
x:=GetmaxX; y:=GetmaxY;
Maxcolor:=Getmaxcolor;
Randomize;
While (not keypressed) do
Begin delay(100);
Putpixel(random(x),random(y),
Random (maxcolor-1)+1);
end;
Closegraph;
End.
Ví dụ 2: Vẽ đồ thị các hàm số: Sin(x),Cos(x) và Arctan(x)
PROGRAM VeDothi;
Uses
Crt,Graph;
Var
mh,mode:integer;chon:char;chugiai:string;
Procedure Chonham;
begin
writeln('Các đồ thị có thể:');
writeln('1---->Ðồ thị hình Sin(x)');
writeln('2---->Ðồ thị hình Cos(x)');
writeln('3---->Ðồ thị hình ArcTan(x)');
write('Chọn đồ thị nào ?'); readln(chon);
Case chon of
'1': chugiai:=ÐỒ THỊ HÀM SIN;
'2': chugiai:=ÐỒ THỊ HÀM COS;
'3': chugiai:=ÐỒ THỊ HÀM ARCTAN;
end;
end;
Function F(chon:char;x:real):real;
begin
Case chon of
'1': F:=Sin(x);
'2': F:=Cos(x);
'3': F:=Arctan(x);
end;
end;
Procedure Dothi(a,b:real;x1,y1,x2,y2:integer;mn,md:integer);
var fx,k,h,r,c,d:real;
x,y,n,m,i:integer;
begin
c:=f(chon,a); d:=f(chon,a);
r:=a; h:=(b-a)/1000;
while r fx then c:=fx;
if d r:=r+h;
end;
Setcolor(md);Setbkcolor(mn);
n:=x2-x1;
h:=(b-a)/n;
m:=y2-y1;
k:=(d-c)/m;
for i:=0 to n do
begin
x:=x1+i;
fx:=f(chon,a+i*h);
y:=round((fx-c)/k)+y1;
y:=y2-y+y1;
if i=0 then moveto(x,y)
else lineto(x,y);
end;
end;
Begin (* Chương trình chính *)
Clrscr;
Chonham;
mh:=detect;
Initgraph(mh,mode,'u:\bgi');
Setviewport(GetmaxX DIV 2,GetmaxY DIV 2,GetmaxX,GetmaxY,ClipOff);
Line(-(GetmaxX DIV 2),0,GetmaxX DIV 2,0);
Line(0,-(GetmaxY DIV 2),0,GetmaxY DIV 2);
SetTextJustify(CenterText,CenterText);
OutTextXY(-GetmaxX DIV 4,-GetmaxX DIV 4,chugiai);
SetColor(Red);
OutTextXY(GetmaxX DIV 2- 32,2,'Truc x >');
OutTextXY(27,-(GetmaxY DIV 2-5),'^ Truc y');
OutTextXY(0,0,'0,0');
Dothi(-4*pi,4*pi,-(getmaxx div 2)+100,-(getmaxy div 2)+100,getmaxx div 2 -100,
Getmaxy div 2 - 100,magenta,yellow);
Readln;
Closegraph;
End.
Bài đọc thêm