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

Bài giảng môn đồ hoạ máy tính

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 (1.94 MB, 94 trang )

Môn

Th i l

h a máy tính

ng: 60 ti t (lý thuy t + th c hành trên máy)

Tài li u tham kh o:
[1] Nh p môn đ h a, L ng Chi Mai, Hu nh Th Thanh Bình, 2000
[2] K thu t đ h a máy tính, Lê T n Hùng, Hu nh Quy t Th ng, 2004
[3] C s đ h a máy tính, Hoàng Ki m, 1999
[4]
h a vi tính, Hu nh V n
c, Nguy n Qu c C ng, Hoàng
cH i
[5] Computer Graphic, J.D. Foley, A.V. Dam
ánh giá:
- Câu h i trên l p
- Bài ki m tra đi u ki n
- Thi: v n đáp / vi t

1


Ph n m đ u: Gi i thi u v đ h a máy tính
Thu t ng “ h a máy tính – Computer Graphics” đ c đ xu t b i m t nhà khoa h c M
tên là Wiliam Fetter vào n m 1960 khi ông đang nghiên c u xây d ng mô hình bu ng lái
máy bay cho hãng Boing.
h a máy tính có th đ c hi u nh là t t c nh ng gì liên quan
đ n vi c t o ra nh (image) b ng máy tính. Chúng bao g m: t o, l u tr , thao tác trên các


mô hình và các nh. W. Fetter đã d a trên các hình nh ba chi u c a mô hình ng i phi
công trong bu ng lái đ xây d ng nên mô hình t i u cho bu ng lái máy bay Boing.
1. T ng quan v m t h đ h a
Các thành ph n ph n c ng:
• Thi t b hi n th : màn hình, máy in
• Thi t b nh p: bàn phím, chu t
C u t o c a màn hình d ng đi m (raster – scan display): chùm tia đi n t đ c quét ngang
qua màn hình m i l n 1 dòng và quét tu n t t trên xu ng d i. Vi c b t t t các đi m sáng
trên màn hình ph thu c vào c ng đ c a tia đi n t và đây là c s cho vi c t o ra hình
nh trên màn hình,
M i đi m sáng trên màn hình đ c g i là pixel. Các thông tin v hình nh trên màn hình
đ c l u tr trong vùng nh đ m g i là b nh màn hình (refresh buffer).
thay đ i hình
nh trên màn hình, c n làm thay đ i thông tin trong vùng nh đ m. Vùng này có th n m
trên Video card hay trích ra t b nh chính.
t o ra nh en - Tr ng, ch c n l u thông tin c a m i pixel b ng 1 bit( 1/0 = b t/t t đi m
nh). Trong tr ng h p nh nhi u màu, ng i ta c n nhi u bit h n. N u ta dùng b bit thì có
th l u tr đ c 2b giá tr màu khác nhau.
Các công c ph n m m:
• Công c ng d ng (application package):đ c thi t k cho ng i s d ng đ t o ra
nh trong nh ng l nh v c chuyên nghi p nào đó mà không c n quan tâm t i các thao
tác bên trong ho t đ ng ra sao. Ví d : AutoCAD, Adobe Photoshop, ...
• Công c l p trình: (programming package): cung c p m t th vi n các hàm đ h a đ
dùng trong các ngôn ng l p trình c p cao. Ví d : GRAPH.TPU (Pascal), Open GL
2. Các ng d ng c a đ h a máy tính (computer graphics)
Công c h tr thi t k (CAD/CAM)
H tr thi t k đ c xem là m t ng d ng chính c a đ h a máy tính, trong đó đ i t ng
đ c xây d ng tr c ti p là mô hình thi t k . Hi n nay đ h a máy tính đ c ng d ng trong
vi c thi t k
• các chi ti t c khí

• h th ng đi n
• thi t b đi n t
• thi t k thân ô tô
• h th ng cáp quang
2


• m ng truy n thông
• và r t nhi u th khác ...
Các chi ti t s đ c v trên màn hình nh các công c đ h a ban đ u d i d ng phác th o,
sau đó đ c ch nh s a b ng kinh nghi m c a ng i k s c ng nh kh n ng tr giúp thông
minh c a ph n m m thi t k .Khác v i các b n v trên gi y, ng i thi t k có th xem mô
hình thi t k trên máy tính t m i góc đ , d dàng thay đ i m i chi ti t và quan sát hi u ng
c a s hi u ch nh đó.
Giao di n Ng i - Máy
Ngày nay h u h t các ch ng trình ng d ng trên PC đ u có giao di n v i ng i dùng d a
trên h th ng t ng tác đ h a: C a s , Bi u t ng, Con tr chu t, Menu .... Giao di n đ
h a th c s mang l i s tho i mái cho ng i s d ng
Bi u di n thông tin
Các trình ng d ng s d ng công c đ h a đ t o ra các bi u đ , đ th ... minh h a t ng
quan gi a các đ i t ng trong kinh doanh, khoa h c, các d li u tài chính, th ng kê ... Các
máy tính, máy ATM, máy bán hàng, máy bán vé tàu ... n i công c ng đ u s d ng giao
di n đ h a đ bi u di n nh ng m c thông tin h ng d n khách hàng
Gi i trí, ngh thu t
i v i các nhà t o m u, ng i ch p nh, nh ng ch ng trình tr giúp thi t k m u hay
ch nh s a nh nh PhotoShop, 3DMax, ... đã giúp h thi t k các hình nh s ng đ ng.
h a máy tính cung c p ph ng ti n cho các nhà làm phim t o ra nh ng b phim n i ti ng
nh Công viên Kh ng long, Xác p Ai c p ... nh nh ng k x o đi n nh th c hi n trên
máy tính
Giáo d c và đào t o

h a máy tính c ng góp ph n quan tr ng trong nghiên c u các th c th tr u t ng, mô
ph ng c u trúc v t th , ti n trình c a các ph n ng hóa h c, h t nhân, ho t đ ng c a các h
th ng sinh lý. Trong đào t o, các ng d ng mô ph ng đ c dùng đ ki m tra trình đ ng i
lái, hu n luy n phi công, đi u khi n giao thông ...
B n đ h c, nghiên c u đ a lý
h a máy tính đ c s d ng đ t o ra các s đ đ a lý và các đ i t ng t nhiên m t cách
chính xác t nh ng s li u đo đ c. Ví d nh b n đ đ a lý, b n đ th i ti t, b n đ m t đ
dân s , s đ khoan th m dò, bi u đ h i d ng h c.

3


Ch

ng I: Công c đ h a c a Turbo Pascal (TP)

1. Gi i thi u
- Thi t b ph n c ng đi u khi n vi c hi n th hình nh lên màn hình có tên là Video Card
(chúng ta hay g i là “card màn hình”).
- Có nhi u lo i Card màn hình v i kh n ng m nh y u khác nhau, m i lo i c n driver (trình
đi u khi n) riêng. B ng sau là các file driver c a TP.
File driver
CGA
HERC.BGI
EGAVGA.BGI

Ki u Video card
IBM CGA , ch hi n th đ c 4 màu
HERCULES MONOCHROME, 2 màu
VGA và đ i đa s các card màn hình

hi n nay.
Có 16 màu.
phân gi i 640 * 480

Chúng ta s
ch dùng lo i
m nh nh t
này

2. Ph i làm gì đ kh i t o ch đ đ h a ?
Chúng ta s l p trình đ h a b ng TP. Mu n v y c n ph i:
-

Có các file: EGAVGA.BGI, GRAPH.TPU (th vi n ch a các l nh v đ h a) và các
file c b n c a TP.
t chúng cùng 1 th m c (n u không thì ph i l p đ ng d n cho GRAPH.TPU t i
Option/Directory/Unit directory và cho EGAVGA.BGI b ng InitGraph)
t l nh kh i t o ch đ đ h a (InitGraph) vào trong ch ng trình

Ví d : Cách đ n gi n và hay dùng nh t đ kh i t o đ h a

Uses Crt,Graph;
Var
h ng đ/n
gd,gm: integer;
s n
Begin
xâu r ng
gd:=detect;
InitGraph(gd,gm,”);

..........
..........
.......... /* Các l nh đ h a v , xóa ... */
CloseGraph; /* k t thúc đ h a, quay v ch đ màn hình v n b n bình th
End.

ng */

Vì sao l i là “đ n gi n và hay dùng nh t” ?
- Không c n gõ v trí t p BGI
- Không c n nh b ng giá tr các ch đ màn hình (có kho ng h n 10 c p giá tr khác
nhau t ng ng v i các ch đ màn hình khác nhau nh EGA, HERCULES, VGA
...)
4


-

Luôn luôn kh i t o đ c ch đ m nh nh t VGA (16 màu, đ phân gi i 640 * 480).
Trong các ph n ti p theo ta luôn gi thi t r ng ch đ đ h a là VGA

Ch đ tham kh o: b ng các lo i graphics card và ch đ đ h a t
GraphDriver
CGA
--EGA
--VGA
----HercMono
...
có t ng c ng 8 giá
tr GraphDriver

khác nhau

GraphMode
CGA0
CGAHi
EGALo
EGAHi
VGALo
VGAMed
VGAHi
HercMonoHi
...
có t ng c ng 30 giá
tr GraphMode khác
nhau

S dòng, c t
320 * 200
640 * 200
640 * 200
640 * 350
640 * 200
640 * 350
640 * 480
720 * 348
...

ng ng

Chúng ta s

ch dùng lo i
m nh nh t
này

3. H tr c t a đ màn hình

(0,0)

(639,0)

(0,479)

(639,479)

Trong ch đ đ h a, chúng ta ph i làm vi c v i m t h tr c t a đ khác th ng:
1) Tr c tung Oy quay xu ng d i (h tr c Decac ngh ch)
2) các giá tr t a đ ph i là các s nguyên
3) N u t a đ v t ra ngoài kho ng (0,639) đ i v i hoành đ và (0,479) đ i v i tung
đ , thì nh ng gì ta v s không hi n th trên màn hình
Gi i thích:
1) Do c u t o c a màn hình, ta ph i ch p nh n.
2) Màn hình chia thành nhi u ô vuông nh (pixel) s p x p theo t ng dòng và c t nh
hình v .
3) Gi s ta v đo n th ng AB, thì ch có đo n CD n m trong màn hình đ c hi n th
5


B
D
C


Màn hình

A

Chú ý: chúng ta không c n nh 2 giá tr 640 và 480 vì TP đã có 2 hàm GetMaxX và
GetMaxY, chúng tr l i giá tr l n nh t c a hoành đ và tung đ đ i v i mode đ h a hi n
th i: GetMaxX = 639 ; GetMaxY = 479 ;

639,0

0,0 1,0 2,0 ...
0,1
0,2
...

m i đi m nh là
1 ô vuông

0,479

4. B ng màu
V i mode đ h a VGA, b ng màu g m 16 màu đ c đánh s t 0 đ n 15 nh trong b ng
sau. Ta có th dùng s th t ho c tên h ng s ch màu
Giá tr s
0
1
2
3
4

5
6
7
8
9

Tên h ng s
Black
Blue
Green
Cyan
Red
Magenta
Brown
LightGray
DarrkGray
LightBlue

Màu
en
Xanh da tr i
Xanh lá cây
Xanh c m th ch
Tía
Nâu
Xám nh t
Xám đ m
Xanh da tr i nh t
6



10
11
12
13
14
15

LightGreen
LightCyan
LightRed
LightMagenta
Yellow
White

Xanh lá cây nh t
Xanh c m th ch nh t
t i
Tía nh t
Vàng
Tr ng

5. V đi m
PutPixel(x,y,c); /* x,y : integer ; c: word (ki u s nguyên d ng) */
V 1 đi m nh t i t a đ (x,y) v i màu c,
GetPixel(x,y):word
Hàm GetPixel tr l i m t s nguyên d ng là màu c a đi m nh t a đ (x,y), nói cách
khác nó cho bi t màu c a pixel(x,y) là màu gì.
Ví d : Tô toàn màn hình b ng màu đ


Uses Crt,Graph;
Var
gd,gm: integer;
i,j:integer;
Begin
gd:=detect;
InitGraph(gd,gm,”);
for i:=0 to GetMaxX do
for j:=0 to GetMaxY do
PutPixel(i,j,red) ;
Readkey;
/* G p readkey ch ng trình s d ng l i đ ta quan sát màn hình. Xem xong ta b m
phím b t k đ qua l nh này */
CloseGraph;
End.

uNh

ng h ng, bi n nào trong ch ng trình trên có th đ c thay b ng nh ng giá tr t ng
đ ng mà không làm thay đ i ch ng trình ?
uVi t ch ng trình tô m t ph n t màn hình (phía trên bên ph i) b ng màu xanh da tr i
uCh ng trình trên l p kín màn hình b ng cách tô theo dòng hay c t ?

7


Ví d : v l

i đi m nh p nháy


uses crt,graph;
var
gd,gm,i,j:integer;
x,y:integer;
begin
gd:=detect; initgraph(gd,gm,'');
randomize; /* kh i t o b sinh s ng u nhiên */
repeat
Hàm tr l i s màu
x:=random(100); y:=random(100);
hi n có (16)
if GetPixel(x,y) <>0 then
Putpixel(x,y,0)
else PutPixel(x,y,random(GetmaxColor));
delay(2);
Until Keypressed;
closegraph;
end.

uHàm GetPixel làm ch c n ng gì trong ví d trên ?
uTh thay đ i giá tr tham s c a hàm delay() và random() và quan sát k

t qu

Ví d : V b u tr i sao đ n gi n

uses crt,graph;
var gd, gm, i : integer;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');

for i := 1 to 1000 do
putpixel(random(640),random(480),random(15)+1);
readkey;
END.

uHãy ph i h p nh ng k thu t trong 2 ví d trên ( hàm random, vòng l p Repeat, l nh
GetPixel ... ) đ t o ra b u tr i sao đ p h n
Ví d : V đ th hàm s y=sin(x)

Uses crt,graph;
Var
tx,ty,gd,gm,i,j:integer;
d,x,y:real;
Begin
gd:=detect; initgraph(gd,gm,'c:\tp\bgi');
setviewport(getmaxX div 2,getmaxY div 2,getmaxX,getmaxY,clipoff);
8


d:=0.001; x:=0; tx:=20; ty:=40;
while x<4*pi do
begin
putpixel(round(tx*x),-round(ty*sin(x)),yellow);
x:=x+d;
end;
readln;
closegraph;
End.

uHãy gi i thích ý ngh a c a tx,ty,d ?

uN u gán d:=0.5 thì k t qu thay đ i ra sao ?
uVì sao ph i có d u tr trong tham s th 2 c

a PutPixel ? N u b d u tr đi thì k t qu ra

sao ?
uHãy v đ th hàm s y = x2 – 2x +1 trong kho ng [-3,3]
uHãy v đ th hàm s y = sin 2x trong kho ng [-2π, 2π]

6. V đo n th ng
Line(x1,y1,x2,y2) /* x1,x2,y1,y2: integer */
V đo n th ng n i (x1,y1) v i (x2,y2) b ng màu v hi n th i n đ nh b i l nh SetColor g n
nh t. N u không có l nh SetColor nào thì màu v m c đ nh luôn là màu Tr ng (white).
Tr

c l nh v đo n th ng ta nên đ t màu v cho l nh Line b ng l nh

SetColor (c); /* c: word */
Chú ý: SetColor ch đ t màu v cho các l nh v đo n th ng, hình ch nh t, đa giác, đ
tròn ...mà không có đ t màu tô cho mi n khép kín.

uHãy v thêm 2 tr
uHãy làm l i ví d

ng

c t a đ cho ví d m u v đ th hàm sin m c trên
“Tô toàn màn hình b ng màu đ ” nh ng dùng l nh Line thay cho

PutPixel

uHãy tô kín hình ch nh t (50,50,100,100) b ng cách dùng l nh Line
50,50

100,100

uV và l p đ y m t hình bình hành b ng các đo n th ng xiên nh hình (a). Có th l p đ y
b ng các đo n th ng n m ngang nh hình (b) đ c không ?
9


(a)

(b)

uBi

t r ng trên màn hình màu đen ch có 1 tam giác màu tr ng có v trí và hình d ng b t
k . Hãy đ m xem có bao nhiêu đi m nh n m bên trong tam giác đó (không tính các c nh) ?

uHãy v

l i đ th hàm y = sin(x) nh ng thay vì ch m t ng đi m nh nh
ta n i đi m nh này v i pixel ti p theo.

ví d trên thì

Ngoài ra còn có 2 l nh v đo n th ng khác
LineTo(x,y) /* x,y: integer */
LineRel(dx,dy) /* x1,x2,y1,y2: integer */
L nh LineTo(x,y) v đo n th ng n i CP hi n th i (xem khái ni m CP ph n sau) v i đi m

(x,y), nói cách khác
Line(x1,y1,x2,y2);
t ng đ ng v i 2 l nh:
MoveTo(x1,y1); LineTo(x2,y2);
Còn LineRel(dx,dy) v đo n th ng t CP đ n 1 đi m có đ chênh là (dx,dy), nói cách khác:
LineRel(dx,dy)
t ng đ ng v i
Line(GetX,GetY,GetX+dx,GetY+dy);
Thi t l p d ng đo n th ng
SetLineStyle(d ng,m u-t -t o,b dày); { ta b qua m u_t _t o b ng cách cho 1 giá tr
nguyên tùy ý}
D ng:

10


SolidLn
DottedLn
CenterLn
DashedLn

0
1
2
3

Nét c
Nét ch m ch m
Nét ch m g ch
Nét đ t đo n

ng) đ n 3 (nét đ m).

B dày có th nh n giá tr t 1 (bình th
7. Thi t l p ch đ v đè

SetWriteMode (mode); /* mode: word */
Mode
CopyPut
XorPut

Giá tr s
0
1

Tác d ng
V hình m i đè lên hình c (ch đ v bình th
Màu c a t ng pixel s đ c Xor v i màu c

Trong ch đ XorPut, giá tr màu v và màu n n đ
v i nhau đ ra màu hi n th .
Xor
0
1

0
0
1

ng)


c nh phân hóa, sau đó làm phép Xor

1
1
0

L nh SetWriteMode có tác đ ng t i các l nh v đ ng nh : Line, LineTo, LineRel,
Rectangle, DrawPoly ... và không tác đ ng t i các l nh v đ ng tròn, elip ...
Ví d : Minh h a ch đ xorput

Uses crt, Graph;
Var
gd,gm: integer;
i,j:integer;
Begin
gd:=detect;
InitGraph(gd,gm,”);
SetFillStyle(1,Brown); /* đ t ch đ tô đ c v i màu tô là nâu */
Bar(100,100,200,200); /* V hình vuông màu nâu */
Readkey;
SetColor(white);
SetWriteMode(XorPut);
for i:=100 to 200 do line(100,i,200,i) ; /* hình vuông đ i thành màu gì ? */
Readkey;
CloseGraph;
End.

11



uSau l
uSau l

nh Readkey th nh t ch ng trình d ng l i, lúc đó trên màn hình có gì ?
nh Readkey th 2 ch ng trình d ng l i, lúc đó trên màn hình có gì ? T i sao ?

Ch đ XorPut đ c bi t hay đ c dùng đ v hình chuy n đ ng vì dù hình m i là gì thì sau
2 l n v đè v i XorPut hình c c ng s đ c khôi ph c nguyên tr ng (v hình chuy n đ ng
không đ l i v t)

uGi

i thích nh n đ nh trên

8. C a s ViewPort c a TP
ViewPort (c a đ h a Pascal) là 1 vùng hình ch nh t trên màn hình.
ta dùng l nh:

thi t l p ViewPort

SetViewPort(x1,y1,x2,y2,clip);
x1,x2,y1,y2: t a đ c a ViewPort; clip = true (không cho phép v ra ngoài) ho c false.
Chú ý là sau khi đã thi t l p ViewPort thì g c t a đ đ c t đ ng chuy n v (x1,y1).

ViewPort: clip=off

ViewPort: clip=on

Xóa n i dung bên trong ViewPort: ClearViewPort;
Lo i b h n ViewPort, tr v ch đ làm vi c toàn màn hình: ClearDevice; L nh này c ng

dùng đ xóa màn hình và đ a CP v (0,0)
9. Con tr trong ch đ đ h a (CP: Current Pointer)
Ta không nhìn th y CP trên màn hình, nh ng TP luôn theo dõi v trí c a CP b ng c p hàm
GetX, GetY: tr l i t a đ hi n th i c a CP
Moveto(x,y): di chuy n CP t i (x,y)
MoveRel(dx,dy): di chuy n CP t i v trí m i cách v trí c 1 đ chênh là (dx,dy)
dx
O

dy

x

Moverel (dx,dy)
(x1,y1)

12
y

(x2,y2)


L nh có liên quan đ n CP:
- LineTo(x,y): v đo n th ng n i t CP đ n (x,y), đ ng th i chuy n CP đ n đó.
- LineRel(dx,dy): v đo n th ng n i t CP đ n v trí m i có đ chênh là (dx,dy) và
kéo CP t i đó.
10. V hình ch nh t
V hình ch nh t có đ nh trên bên trái là (x1,y1), đ nh d
song v i 2 tr c:
Rectangle(x1,y1,x2,y2); /* x1,y1,x2,y2: integer */


i ph i (x2,y2) và các c nh song

v và tô hình ch nh t đ c ta dùng Bar(x1,y1,x2,y2); /* x1,y1,x2,y2: integer */
màu tô và m u tô ph i đ c thi t l p t tr c b ng l nh
SetFillStyle(Pattern, Color);
Pattern
EmptyFill
SolidFill
LineFill
LtSlashFill
Slashfill
....
UserFill

Giá tr s
0
1
2
3
4
...
12

Màu n n (= đ tr ng)
Màu đ c
G ch d c
Tô s c chéo th a
Tô s c chéo dày
ng


M u tô

i l p trình t đ nh ngh a b ng l nh SetFillPattern()

L nh SetFillStyle() đ t m u tô cho các l nh tô hình kín nh :
• Rectangle: hình ch nh t
• Bar: hình ch nh t đ c
• Bar3D: hình h p
• FillPoly: đa giác
• PieSlice: qu t tròn

Ví d : V bàn c

uses crt,graph;
13


const stop=50;
var
gd,gm,i,j,c nh,a,màu:integer;
Begin
canh:=40;
a:= 100;
gd:=detect; initgraph(gd,gm,'');
màu:=white;
setlinestyle(1,1,3);
rectangle(a,a,a+8*canh,a+8*canh); {v khung bàn c b ng đ ng đ t đo n}
for i:=0 to 7 do
for j:=0 to 7 do

begin
setfillstyle(1,mau);
bar(a+i*canh,a+j*canh,a+(i+1)*canh,a+(j+1)*canh); {1}
if j<>7 then {ô d i cùng c a m t c t}
if mau=white then mau:= black else mau:=white; {2}
end;
readkey;
closegraph;
end.

uGi

i thích ý ngh a c a bi n a, canh, i,j trong ch ng trình trên ? Các l nh {1}, {2} có tác
d ng gì ?
u o n trình sau có v đ c bàn c không ?
for i:=0 to 7 do
for j:=0 to 7 do
begin
if (i+j) mod 2 =0 then mau:=white else mau:= black;
setfillstyle(1,mau);
bar(a+i*canh,a+j*canh,a+(i+1)*canh,a+(j+1)*canh);
end;

uV

các hình ch nh t có v trí và kích th c ng u nhiên (có các c nh n m ngang ho c
th ng đ ng nh hình (a)
uV các hình ch nh t ng u nhiên (các c nh có th nghiêng tùy ý ki u nh hình (b)

14



(b)

(a)

uHãy v m t hình vuông tâm màn hình, cho nó t t phình to ra đ n khi ch m rìa màn
hình thì d ng l i. Sau đó co l i đ tr v kích th c ban đ u.

11. a giác
V đa giác
DrawPoly(n,P);
n: s đ nh đa giác +1
P: tham s ch a t a đ các đ nh c a đa giác
Tô đa giác b ng l nh sau:
FillPoly(n,P); /* n và P nh trên. Chú ý là n không c n c ng 1*/
Xem các ví d sau đ hi u rõ
Ví d : V các ng giác ng u nhiên

Uses crt,graph;
Type
Dinh = Record /* nh đa giác */
x,y:integer;
End;
15


Var
gd,gm:integer;
i:integer;

dagiac: array[1..6] of Dinh;
Begin
gd:=detect;
InitGraph(gd,gm,'');
Randomize;
Repeat
SetColor(random(GetMaxColor));
/* màu đ c ch n ng u nhiên */
for i:=1 to 5 do
begin
dagiac[i].x:=random(getMaxX);
/* t a đ đ nh đ c ch n ng u nhiên */
dagiac[i].y:=random(getMaxY);
end;
dagiac[6]:=dagiac[1];
DrawPoly(6,dagiac);
Delay(1000);
Until KeyPressed;
CloseGraph;
End.
Chú ý l nh dagiac[6]:=dagiac[1] .
trùng v i đ nh đ u.

v đa giác kín N đ nh ta ph i t o ra đ nh th N+1

uCác đa giác trong ch

ng trình trên đè ch ng lên nhau và làm đ y màn hình. Hãy s a
ch ng trình đ chúng hi n lên r i t t t. Hãy s a đ luôn luôn l u l i trên màn hình 3 đa
giác m i nh t.


Ví d : V và tô các ng giác ng u nhiên

Uses crt,graph;
Type
Dinh = Record
x,y:integer;
End;
Var
gd,gm:integer;
i:integer;
dagiac: array[1..6] of Dinh;
Begin
gd:=detect;
InitGraph(gd,gm,'');
Randomize;
Repeat
SetColor(random(GetMaxColor));
SetFillStyle(SolidFill,random(GetMaxColor));
16


for i:=1 to 5 do
begin
dagiac[i].x:=random(getMaxX);
dagiac[i].y:=random(getMaxy);
end;
dagiac[6]:=dagiac[1];
DrawPoly(6,dagiac);
FillPoly(6,dagiac);

Delay(2000);
Until KeyPressed;
CloseGraph;
End.
Chú ý quan sát ta th y, v i các đa giác lõm l nh FillPoly tính toán t t c các ch t c t và
sau đó tô riêng t ng ph n. Màu tô và m u tô xác đ nh b i SetFillStyle. D i đây là 1 ng
giác lõm v i các c nh t c t đ c tô b i FillPoly

12. Tô màu mi n kín
FloodFill(x,y,c); /* x,y : integer; c: word */
Vùng c n tô đ c nh n d ng nh 2 y u t :
- đ ng biên khép kín đ ng màu (ký hi u màu là c)
- đi m (x,y) là m t đi m b t k n m bên trong vùng c n tô.
Màu tô và m u tô đ c n đ nh b i SetFillStyle
(x,y)
(x,y)

Ví d : V LÁ C

SAO VÀNG

uses crt,graph;
17


var gd, gm, i, goc, r : integer;
p : array[1..5,1..2] of integer; { to đ các đ nh ngôi sao }
BEGIN
gd := 0; initgraph(gd,gm,'');
goc := 18; r := 100;

for i := 1 to 5 do begin
p[i,1] := round(r*cos(goc*pi/180)); { hoành đ c a đ nh th i }
p[i,2] := - round(r*sin(goc*pi/180)); { tung đ c a đ nh th i }
goc := goc + 2*72;
end;
SetFillStyle(1,red);
{v lá c là hình ch nh t màu đ }
Bar(100,100,540,380);
SetViewPort(320,240,600,400,false); {chuy n g c to đ ra gi a màn hình}
SetColor(yellow);
SetFillStyle(1,yellow);
FillPoly(5,p);
{2 l nh này tô hình ngôi sao vàng }
FloodFill(0,0,yellow);
readkey;
END.

u Vì sao trong công th

c tính tung đ đ nh th i c a ngôi sao l i có d u tr ? N u b d u
tr này đi thì hi n t ng gì x y ra ?
u Vì sao ph i c n 2 l nh m i tô đ c ngôi sao ? N u b l nh FloodFill đi thì k t qu s ra
sao ? Ho c n u ch b đi l nh FillPoly thì trên màn hình s có gì ?
uL nh FillPoly trên tô màu m t ng giác, đó là ng giác nào ?
uGi i thích các l nh: goc := 18; goc := goc + 2*72;
uVì sao không v và tô đa giác 10 đ nh (123456789-10) ? thay vào đó ví d trên v đa
giác nào ?
y
A
B


1
E

3

180
O
C

2

10

4

x

9
8

6

D

5

13. V cung, đ ng tròn
V đ ng tròn tâm (x,y) bán kính r :
Circle(x,y,r); /* x,y: integer; r: word */

V cung tròn: Arc(x,y, g1,g2,r);
18

7


x,y: integer - t a đ tâm đ

ng tròn

g1,g2: word – góc b t đ u và góc cu i
c a cung tròn (tính b ng đ )

A
B

g2
g1

r: word – bán kính

O

v hình qu t tròn, đ u tiên ta v cung tròn, sau đó g i th t c
GetArcCoords(VAR ArcCoords: ArcCoodsType);
đ l y t a đ 2 đ u mút (A,B) c a cung.Cu i cùng ta v hai đo n th ng n i chúng v i tâm O
c a đ ng tròn
V i ki u ArcCoodsType đ c đ nh ngh a nh sau:
Type
ArcCoodsType = RECORD

x,y:integer;
xStart,yStart:integer;
xEnd,yEnd:integer;
END
trong đó (x,y) là t a đ tâm O, (xStart,yStart) là t a đ đi m đ u B c a cung, (xEnd,yEnd)
là đi m cu i A.
Ví d : V qu t tròn

uses crt,graph;
var
gd,gm:integer;
a:ArcCoordsType;
x,y,g1,g2,r: integer;
Begin
gd:=detect; initgraph(gd,gm,'');
x:=GetMaxX div 2; y:=GetMaxY div 2; { tâm đ t chính gi a màn hình }
g1:=30; g2:=330;
{góc b t đ u, góc k t thúc }
r:=100;
arc(x,y,30,330,100);
GetArcCoords(a);
line(x,y,a.xStart,a.yStart);
line(x,y,a.xEnd,a.yEnd);
readkey;
closegraph;
End.

uC

i ti n ch


ng trình trên đ v đ u cá đóng - m mi ng liên t c
19


uVi

t ch

ng trình v hình tr ng l

i li m và khuyên

V cung elip tâm (x,y), bán tr c l n xr, bán tr c bé yr, góc b t đ u và góc k t thúc là g1,g2
Ellipse(x,y,g1,g2,xr,yr)

yr

xr

V và tô hình qu t tròn:
PieSlice(x,y, g1,g2, r);
Ý ngh a các tham s gi ng nh l nh Arc
tô màu ellip, c ng nh đ ng tròn, ta dùng th t c:
FillEllipse(x,y,xr,yr); {x,y:integer; xr,yr: word}
tô m t cung ellip ta g i th t c
Sector(x,y,StAngle,EndAngle,xr,yr); {x,y: integer; StAngle,EndAngle, xr,yr: word}

20



Ví d : V BÓNG CHUY N

NG KI U B T T

NG

uses crt,graph;
var gd,gm,x,y,dx,dy,r : integer;
BEGIN
gd := 0; initgraph(gd,gm,'');
x := 100; y := 100; dx := -6; dy := 5; r := 30;
repeat
setcolor(yellow);
circle(x,y,r); {v đ ng tròn màu vàng}
delay(20);
setcolor(0);
circle(x,y,r); {v đ ng tròn màu trùng màu n n <=> xoá }
if (x>=640-r) or (x{n u ch m c nh trái/ph i thì đ i h ng}
if (y>=480-r) or (y{n u ch m c nh trên/d i thì đ i h ng}
x := x + dx; y := y + dy;
{c p nh t to đ }
until keypressed;
{có phím nh n thì d ng}
END.

uV trí xu t phát, kích th c bóng là gì ? bi n nào quy đ nh h
uCh ng trình trên dùng k thu t gì đ v hình chuy n đ ng ?

uLàm sao đ t ng/gi m t c đ bóng ?
Ví d : V đ ng h v i kim giây chuy n đ ng

Uses crt,graph;
Var
gd,gm:integer;
x,y,a,b,r:integer;
c,i,x1,x2,y1,y2:integer;
g,d:real;
Begin
gd:=detect; initgraph(gd,gm,'c:\tp\bgi');
a:=GetMaxX div 2; b:=GetmaxY div 2;
21

ng xu t phát c a bóng ?


Setcolor(Yellow);
SetWriteMode(Xorput);
r:=150;
Circle(a,b,r);
{V các v ch chia}
c:=5; {chi u dài ½ v ch chia}
d:=pi/6; g:=0;
while g< 2*pi do
begin
g:=g+d;
x1:=a+round((r-c)*cos(g));
x2:=a+round((r+c)*cos(g));
y1:=b-round((r-c)*sin(g));

y2:=b-round((r+c)*sin(g));
line(x1,y1,x2,y2); {V v ch chia}
end;
{V kim giây chuy n đ ng}
x:=a; y:=b-r; line(a,b,x,y);
g:=pi/2; d:=pi/30;
repeat
line(a,b,x,y);
g:=g-d;
x:=round(a+r*cos(g)); y:=round(b-r*sin(g));
line(a,b,x,y);
delay(1000);
until KeyPressed;
closegraph;
End.

uÝ ngh a các bi n a,b,x,y, r, d là gì ?
uCh ng trình trên dùng k thu t gì đ v kim giây chuy n đ ng ?
uN u là v kim phút thì ph i s a ch ng trình trên nh th nào ?
uHãy v đ ng h v i 2 kim cùng chuy n đ ng: kim giây và kim 1/10 giây
14. Vi t ch

(x,y)

OutText(s);
{s: string}
OutTextXY(x,y,s); {x,y:integer; s: string}

ABCDEFG


L nh OutText(s) hi n th xâu ký t s t i v trí CP, không di chuy n CP. L nh OutTextXY
hi n th xâu ký t s t i v trí (x,y). Các phông ch (font) khác nhau n m trên các file *.CHR,
nên đ chúng t i cùng v trí v i file *.BGI. Ch n ki u font ch b ng l nh sau:
SetTextStyle(Font, Direction, Size);

22


Tham s font nh n các giá tr sau
Tên font
DefaultFont
TriplexFont
SmallFont
SansSerifFont
GothicFont

Giá tr s
0
1
2
3
4

Tham s Direction nh n các giá tr sau
Chi u vi t Giá tr
s
HorizDir 0
VertDir
1


Tác d ng
vi t ngang
vi t theo chi u
th ng đ ng

H s phóng to Size nh n các giá tr t 1 đ n 10.
Ví d : V ch

có bóng

uses crt,graph;
Var
gd,gm,i:integer;
Begin
gd:=detect; initgraph(gd,gm,'');
setTextStyle(GothicFont,0,10);
SetColor(DarkGray);
{1}
for i:=1 to 10 do outTextxy(100+i,100-i,'Graphic');
SetColor(LightGray);
{2}
outTextxy(100,100,'Graphic');
readln;
closegraph;
End.

uMàu ch

và màu bóng có gi ng nhau không ? gi i thích tác d ng c a l nh {1} và {2} ?
n u hoán v 2 l nh đó thì sao ?

uLàm sao đ đi u khi n ch đ bóng sang h ng trái/ph i, lên trên/xu ng d i nh các
hình d i đây?

uVi

t ch

ng trình đ các dòng ch chuy n đ ng t hai bên ra gi a / r i t trên xu ng ...

23


15. C t dán hình
l u m t hình vào b nh , ta ph i l u c di n tích hình ch nh t bao nó
Memory
(x1,y1)

(x2,y2)

ABC

tính toán kích th c vùng nh c n dùng đ ch a hình, ta g i hàm
ImageSize(x1,y1,x2,y2) ; {x1,y1,x2,y2: integer }
v i (x1,y1,x2,y2) là t a đ hình ch nh t bao quanh hình c n l u tr . Chú ý là TP không
cho phép l u tr m t hình có di n tích quá l n.
Sau đó, ta xin trình d ch c p phát vùng nh này b ng cách g i th t c
GetMem(p: pointer, n: word) ;
Th t c này xin c p phát 1 vùng nh n byte (n ph i đ c d trù tr c b ng cách g i hàm
ImageSize), r i l u đ a ch vùng nh đó vào con tr p. Chú ý: sau khi dùng xong nên gi i
phóng vùng nh này b ng FreeMem(p,n); n u không sau vài l n g i GetMem s c n dung

l ng nh .
B c ti p theo, ta dùng th t c
GetImage(x1,y1,x2,y2, p) ; {x1,y1,x2,y2: integer ; p: pointer}
đ sao chép các đi m nh trên màn hình n m trong ph m vi hình ch nh t (x1,y1,x2,y2) vào
vùng nh xác đ nh b i con tr p;
Khi c n thi t, ta dán nh đang l u trong b nh ra màn hình b ng th t c
PutImage(x,y,p,mode); {x,y: integer; p: pointer; mode: word}
L nh này s copy nh đang l u trong b nh xác đ nh b i p vào v trí (x,y) theo ki u mode
Tham s mode nh n các giá tr nh sau
Mode
CopyPut
XorPut

Giá tr s
0
1

Tác d ng

V hình m i đè lên hình c
Màu c a t ng pixel s đ c Xor v i màu c

24


Ví d : C t dán nh

uses crt,graph;
var
gd,gm:integer;

i,x,y,dx,dy,canh:integer;
p:pointer; {con tr tr t i vùng nh dùng đ c t gi nh}
size:word;
Begin
gd:=detect; initgraph(gd,gm,'');
randomize;
dx:= GetMaxX div 2; dy:= GetMaxY div 2;
SetViewPort(0,0,dx,dy,true);
for i:=1 to 40 do {V các vòng tròn ng u nhiên trong ph n t màn hình trên bên trái}
begin
x:=random(dx); y:=random(dy);
SetColor(random(GetMaxColor));
circle(x,y,random(dy));
end;
SetViewPort(0,0,GetMaxX,GetMaxY,false);
SetColor(White);
x:=50; y:=50; canh:=100; { nh c n l u là 1 hình vuông c nh dài 100 pixel}
Rectangle(x,y,x+canh,y+canh); {v đ ng bao quanh ph m vi nh c n l u}
Size:=ImageSize(x,y,x+canh,y+canh);
GetMem(p,size);
GetImage(x,y,x+canh,y+canh,p^);
PutImage(x+dx,y,p^,CopyPut);
readkey;
closegraph;
End.
25


×