You are on page 1of 9

Böôùc ñaàu xaây döïng hình aûnh

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 1


aûnh

Vò trí hieän thôøi trong toïa ñoä thöïc

ª Baát tieän cuûa Line( ) vaø LineNDC( )


° caàn caû hai ñieåm bieân cuûa ñoaïn thaúng caàn ñöôïc veõ, do ñoù dö thöøa

trong caùc öùng duïng caàn veõ caùc ñoaïn thaúng lieân tieáp nhau.

p2
Line(p1, p2);
Line(p2, p3);
p1 p3

ª Vò trí hieän thôøi CP (current position), duøng toïa ñoä thöïc


° Bieán toaøn cuïc var p : point, do öùng duïng duy trì,

ª MoveTo (p : point): caäp nhaät CP thaønh p.

ª LineTo(p : point): veõ ñoaïn thaúng (ñaõ ñöôïc xeùn) töø CP ñeán p

vaø caäp nhaät CP thaønh p.

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 2


aûnh
Vò trí hieän thôøi CP

ª Vò trí hieän thôøi CP coù theå naèm ngoaøi cöûa soå

var CP : point; {global variable}


procedure MoveTo(p : point); {Change CP to p}
begin
CP := p
end;
procedure LineTo(p : point); {Veõ töø CP ñeán p vaø caäp nhaät CP}
begin
Line(CP, p); {draw clipped line}
CP := p {update CP}
end;

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 3


aûnh

Di chuyeån vaø veõ töông ñoái

ª Line( ) caàn toïa ñoä “tuyeät ñoái” cuûa caùc ñieåm bieân.
– baát tieän khi veõ cuøng moät ñoái töôïng taïi nhieàu vò trí khaùc nhau
ª Caùc caùch khaùc ñeå veõ ñoaïn thaúng ñöôïc tieän lôïi khi veõ taïi nhieàu vò trí
khaùc nhau

type vector = record


dx, dy : real
end;

– MoveRel(Disp : vector), vôùi Disp laø moät vector, caäp nhaät CP


thaønh CP + Disp
– LineRel(Disp : vector), veõ ñoaïn thaúng noái CP vaø CP + Disp, roài
caäp nhaät CP thaønh CP + Disp

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 4


aûnh
Ví duï veõ töông ñoái

ª Veõ “muõi teân” laø moät tam giaùc caân


CP

procedure Arrow(w, h : real);


begin
LineRel_(w, -h);
LineRel_(-2*w, 0.0);
LineRel_(w, h)
end;

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 5


aûnh

Toïa ñoä cöïc töông ñoái

ª Höôùng hieän thôøi CD (current direction): moâ hình bôûi moät con ruøa.
Bieán CD laø goùc ño (ñôn vò laø ñoä) töø truïc x ngöôïc chieàu kim ñoàng hoà.
Bieán CD laø toaøn cuïc.
CD
x
– LineForward(dist : real): veõ ñoaïn thaúng töø vò trí hieän thôøi CP
theo höôùng hieän thôøi CD moät khoaûng caùch dist, sau ñoù caäp nhaät
CP thaønh vò trí môùi.
– MoveForward(dist : real): khoâng veõ gì caû, chæ caäp nhaät CP gioáng
nhö trong LineForward( )
– Right(angle : real): neáu angle > 0 thì quay con ruøa moät goùc angle
theo chieàu kim ñoàng hoà, neáu angle < 0 thì quay con ruøa ngöôïc
chieàu kim ñoàng hoà moät goùc |angle|. Khoâng veõ, chæ coäng theâm
angle vaøo CD.
21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 6
aûnh
Ví duï öùng duïng ñoà hoïa con ruøa

ª Veõ ngoâi nhaø


procedure Turtle_House;
begin
LineForward(20.0); {veõ töôøng beân traùi }
Right(30.0); {quay phaûi 30 ñoä }
LineForward(20.0); {veõ maùi nhaø beân traùi }
Right(120.0);
LineForward(20.0);
Right(30.0);
con ruøa LineForward(20.0);
Right(90.0);
LineForward(20.0);
Right(90.0) {quay veà höôùng ban ñaàu}
end;

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 7


aûnh

Ví duï öùng duïng ñoà hoïa con ruøa (tieáp)

ª Duøng kyõ thuaät ñoà hoïa con ruøa ñeå veõ hình phöùc taïp

for i := 1 to 6 do
begin
Turtle_House;
Right(60.0)
end;

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 8


aûnh
Hieän thöïc thuû tuïc LineForward( )

ª Vôùi CD laø höôùng hieän thôøi (ñôn vò laø ñoä)

const TWOPI = 6.283185308; {2π}


var CD : real;
procedure LineForward(dist : real);
var
angle : real;
p : point;
begin
angle := TWOPI*CD/360.0; {ñoåi ñoä sang radian}
p.x := CP.x + dist*cos(angle);
p.y := CP.y + dist*sin(angle);
LineTo(p);
CP := p
end;
21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 9
aûnh

Hieän thöïc thuû tuïc Right( )

procedure Right(angle : real);


{quay moät goùc angle theo chieàu kim ñoàng hoà}
begin
CD := CD - angle
end;

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 10


aûnh
Ví duï veõ aûnh duøng höôùng töông ñoái

ª Hình xoaén oác (Polyspiral) laø hình coù daïng xoaén oác:

procedure Polyspiral(dist, angle, incr : real; num : integer);


{Veõ num ñoaïn thaúng cuûa moät hình xoaén oác vôùi goùc ngoaøi cho tröôùc}
var i : integer;
begin
for i := 1 to num do
begin
LineForward(dist);
Right(angle);
dist := dist + incr
end
end;

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 11


aûnh

Bieåu dieãn döõ lieäu chuoãi soá

ª Döõ lieäu chuoãi soá trong kinh doanh, ño löôøng,...


ª Döõ lieäu coù daïng: y1, y2,...,yn (chæ soá i bieåu dieãn thôøi gian, vò trí,...)

type
sequence = record
num : 0..maxnum;
values : array[1..maxnum] of real
end;

ª Phöông phaùp bieåu dieãn: chuoãi ñieåm (1, y1), (2, y2),...,(n, yn) trong maët
phaúng x-y

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 12


aûnh
Ñoà thò ñöôøng

ª Ñoà thò ñöôøng (line graph)


– data yi , vôùi i = 1,..., n

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 13


aûnh

Ñoà thò ñöôøng (tieáp)

ª Xaùc ñònh cöûa soå


(1 - bord, ymax + bord)
bord

(data.num + bord, ymin - bord)


procedure LineGraph(data : sequence);
{Veõ ñoà thò ñöôøng bieåu dieãn bôûi moät chuoãi caùc ñieåm }
{veõ caùc truïc ngang vaø ñöùng }
const bord = 0.3; {ñoä roäng cuûa vuøng leà troáng}
var
ymin, ymax : real;
i : integer;
21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 14
aûnh
Ñoà thò ñöôøng (tieáp)

begin
if data.num > 1 then {ít nhaát 2 ñieåm} begin
Extremes(data, ymin, ymax); {tìm caùc cöïc trò cuûa caùc trò cuûa y}
SetRect(1 - bord, ymax + bord, data.num + bord, ymin - bord, W);
.
. {ngöôøi duøng choïn vuøng nhìn V}
.
MapRects(W, V, sx, tx, sy, ty)); {caøi aùnh xaïtöø cöûa soå ñeán vuøng nhìn}
with data do begin {veõ polyline}
MoveTo_(1.0, values[1]);
for i := 2 to num do LineTo_(i + 0.0, values[i])
end;
Line_(1.0, ymin, 1.0, ymax); {veõ truïc ñöùng }
Line_(1.0, 0.0, data.num, 0.0) {veõ truïc ngang }
end
end;
21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 15
aûnh

Ñoà thò coät

ª Ñaëc taû ñoà thò coät (bar graph):


– coät laø hình chöõ nhaät
– coät i baét ñaàu taïi x = i
– chieàu roäng cuûa coät cho tröôùc
ª procedure BarGraph(data : sequence; width : real)

width

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 16


aûnh
Baøi thí nghieäm/thöïc haønh 3

ª 1. Tham soá hoùa thuû tuïc Turtle_House. Haõy vieát thuû tuïc
Turtle_House(size : real), trong ñoù size xaùc ñònh ngoâi nhaø caàn ñöôïc
veõ lôùn bao nhieâu.
ª 2. Ñònh nghóa cuûa MoveTo( ) chæ thay ñoåi giaù trò cuûa moät soá bieán beân
trong chöông trình, chöù khoâng thöïc söï göûi meänh leänh naøo ñeán thieát
bò. Thaønh ra neáu thieát bò laø moät pen plotter thì caây vieát seõ khoâng di
chuyeån khi MoveTo( ) ñöôïc goïi. Ñaây coù laø vaán ñeà hay khoâng: plotter
coù hoaït ñoäng nhö mong muoán khoâng khi laàn tôùi LineTo( ) ñöôïc goïi?
ª 3. Theâm vaøi thuû tuïc con ruøa. Hieän thöïc caùc thuû tuïc con ruøa sau
– Left(angle : real)
– LineBackward(dist : real)
– TurnTo(angle : real): gaùn vaøo CD trò angle

21.9.2003 Chöông 4: Böôùc ñaàu xaây döïng hình 17


aûnh

You might also like