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