You are on page 1of 21

Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån chuùng

Thieát bò hieån thò

ª Thieát bò queùt raster (refresh CRT, raster-scan display): ñaõ ñöôïc trình
baøy
ª Thieát bò hieån thò ñoaïn thaúng (line-drawing display): chæ hieån thò ñöôïc
ñoaïn thaúng
– Pen plotter
ª Leänh cô baûn:

Pen_Up
Pen_Down
Go_To(x, y)
Get_Pen(i)
– Vector-refresh display

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 2


ñieàu khieån chuùng
Pen plotter

ª Heä thoáng toïa ñoä

(1023, 767)

caây vieát

x
(0, 0)

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 3


ñieàu khieån chuùng

Bieåu dieãn ñoaïn thaúng trong frame buffer

ª Device driver Line


ª So saùnh vôùi giaûi thuaät cuûa Bresenham!
procedure DD_Line(row1, col1, row2, col2, color : integer)
{Bieåu dieãn trong frame buffer ñoaïn thaúng noái (col1, row1) vaø (col2, row2}
{Tröôøng hôïp ñaëc bieät: -1 ≤ heä soá goùc ≤ 1 vaø col1 ≤ col2}
var
dx, dy, y, m : real;
x : integer;
begin
dx := col2 - col1;
dy := row2 - row1;
m := dy/dx;
y := row1;
for x := col1 to col2 do begin
SetPixel(x, Round(y), color);
y := y + m
end
end;
Code fragment 2.1 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 4
ñieàu khieån chuùng
NDC

ª Toïa ñoä thieát bò ñöôïc chuaån hoùa (NDC, normalized device


coordinates):
Vuøng hình vuoâng vôùi goùc döôùi beân traùi (lower left corner) vaø goùc
treân beân phaûi (upper right corner) coù toïa ñoä laø (0, 0) vaø (1, 1).
ª Duøng NDC ñeå goïiù thuû tuïc veõ ñoaïn thaúng gioáng nhau cho moïi thieát bò
procedure LineNDC_(x1, y1, x2, y2 : real)
{ Veõ ñoaïn thaúng noái (x1, y1) vaø (x2, y2) trong NDC
Coù moät thuû tuïc nhö theá naøy cho moãi loaïi thieát bò
Caùch goïi thuû tuïc ñeàu nhö nhau cho moïi loaïi thieát bò.}
y Display
1. (x2, y2)

(x1, y1)
x
1.
p. 37 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 5
ñieàu khieån chuùng

Ví duï veõ aûnh duøng LineNDC_( )

ª Veõ hình chöõ nhaät leân thieát bò


y Display
1. (x2, y2)

(x1, y1)
x
1.
procedure Box(x1, y1, x2, y2 : real);
{Veõ hình chöõ nhaät coù ñænh döôùi beân traùi (x1, y1)
vaø ñænh treân beân phaûi (x2, y2) trong NDC}
begin
LineNDC_(x1, y1, x2, y1);
LineNDC_(x2, y1, x2, y2);
LineNDC_(x2, y2, x1, y2);
LineNDC_(x1, y2, x1, y1)
end; {Box}
Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 6
ñieàu khieån chuùng
AÙnh xaï NDC vaøo moät thieát bò

ª Hieån thò moät ñieåm trong NDC thaønh moät ñieåm cuûa thieát bò
ª AÙnh xaï sao cho NDC aùnh xaï thaønh hình vuoâng ôû giöõa lôùn nhaát cuûa
thieát bò hieån thò
NDC → thieát bò
( x, y ) α (dx, dy )
dx = Ax + B
y
dy = Cy + D Hình vuoâng
lôùn nhaát
NDC
1.
Q
P dy
y Display

x dx
x 1.
Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 7
ñieàu khieån chuùng

AÙnh xaï NDC vaøo moät thieát bò (tieáp)

ª Baøi toaùn: Xaùc ñònh caùc heä soá A, B, C, D


ª Ví duï: ymax < xmax . Hình vuoâng lôùn nhaát ôû giöõa thieát bò coù
goùc treân traùi: ((xmax − ymax)/2, ymax)
goùc döôùi phaûi: ((xmax + ymax)/2, 0)
Hình vuoâng
lôùn nhaát
y dy

ymax 767
1.

NDC
dx
128 895 1023
x xmax
1.

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 8


ñieàu khieån chuùng
AÙnh xaï NDC vaøo moät thieát bò (tieáp)

ª Tính ñöôïc: (128, 767) vaø (895, 0)


ª Töø treân tìm ñöôïc: dx = 767 x + 128
dy = 767 y

Hình vuoâng
lôùn nhaát
y dy

ymax 767
1.

NDC
dx
128 895 1023
x xmax
0. 1.

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 9


ñieàu khieån chuùng

Veõ töø NDC vaøo thieát bò

ª Thuû tuïc veõ töø NDC leân hình vuoâng ôû giöõa lôùn nhaát cuûa thieát bò
procedure LineNDC_(x1, y1, x2, y2 : real);
{aùnh xaï leân hình vuoâng lôùn nhaát. Giaû söû Maxy ≤ Maxx}
const Maxx = 1023; phuï thuoäc thieát bò
Maxy = 767;
var dx1, dy1, dx2, dy2 : integer;
offset : real;
begin
offset := (Maxx - Maxy)/2.0;
dx1 := round(Maxy*x1 + offset); {aùnh xaï leân hình vuoâng }
dy1 := round(Maxy*y1); {lôùn nhaát }
dx2 := round(Maxy*x2 + offset);
dy2 := round(Maxy*y2);
Pen_Up;
Go_To(dx1, dy1);
Pen_Down;
Go_To(dx2, dy2)
end;
Code fragment 2.3 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 10
ñieàu khieån chuùng
AÙnh xaï töø NDC leân toaøn thieát bò

R = Heä soá tyû leä (cuûa moät hình chöõ nhaät) = cao
roäng
ª Giaû söû R cuûa thieát bò < 1.
ª Laøm theá naøo ñeå taän duïng ñöôïc caû beà maët cuûa thieát bò?

y RNDC Rdev
NDC
1.

x
1.

Heä soá tyû leä laø R


Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 11
ñieàu khieån chuùng

AÙnh xaï töø NDC leân toaøn thieát bò

Giaûi phaùp: Chæ söû duïng moät phaàn thích hôïp cuûa NDC

dx = Ax + B
⇒ dx = xmax x
dy = Cy + D dy = xmax y
y RNDC Rdev
NDC
1.

x
0 1.

Heä soá tyû leä laø R < 1.


Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 12
ñieàu khieån chuùng
LineNDC_( ) vaø LineNDC( )

ª Kieåu döõ lieäu cho ñieåm trong maët phaúng


type point = record
x, y : real
end;

procedure LineNDC(p1, p2 : point);


{Veõ ñoaïn thaúng noái p1 vaø p2}

Code fragment 2.4 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 13
ñieàu khieån chuùng

Polyline

ª polyline: chuoãi caùc ñoaïn thaúng


ª Kieåu döõ lieäu bieåu dieãn polyline
polypoint = record
num : 0..MaxVert; {number of points}
pt : array [1..MaxVert] of point
end; y
1.
procedure PolylineNDC(poly : polypoint);
{Veõ polyline poly}
var i : integer; x
begin 1.
with poly do if num > 1 then
for i := 1 to (num - 1) do LineNDC(pt[i], pt[i + 1])
end;

Code fragment 2.6 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 14
ñieàu khieån chuùng
Polymarker

ª Ñaëc taû polymarker


° ñònh nghóa tröôùc marker: ♣, ∆, ∗,...

thuoäc tính: maøu, kích thöôùc


° interface

procedure Polymarker(places : polypoint)




Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 15


ñieàu khieån chuùng

Text

ª Ñaëc taû text


° font (kieåu): ví duï Courier, Helvetica,...
serif
sans serif: sans serif
° tröõ font döôùi daïng
bitmap
öu ñieåm: ñònh nghóa vaø hieån thò deã daøng, khoâng qua scan
conversion
khuyeát ñieåm: khoâng deã daøng sinh ra kích thöôùc khaùc
outline: bieåu dieãn kyù töï baèng caùc ñoaïn thaúng vaø ñöôøng cong
öu ñieåm: deã daøng sinh ra kích thöôùc khaùc
khuyeát ñieåm: phaûi qua scan conversion
° interface
procedure Text(x, y, String)
Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 16
ñieàu khieån chuùng
Duøng LineNDC_( ) ñeå veõ hình

ª Veõ aûnh chæ goàm caùc ñoaïn thaúng duøng thuû tuïc LineNDC_( )
ª LineNDC_(x1, y1, x2, y2 : real)

procedure House;
begin
LineNDC_(0.5, 0.7, 0.8, 0.5); {veõ daùng cuûa nhaø}
LineNDC_(0.8, 0.5, 0.8, 0.1);
LineNDC_(0.8, 0.1, 0.2, 0.1);
LineNDC_(0.2, 0.1, 0.2, 0.5);
LineNDC_(0.2, 0.5, 0.5, 0.7);
LineNDC_(0.35, 0.1, 0.35, 0.3); {veõ cöûa}
LineNDC_(0.35, 0.3, 0.5, 0.3);
LineNDC_(0.5, 0.3, 0.5, 0.1)
end;

Code fragment 3.1 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 17
ñieàu khieån chuùng

Ví duï moät chöông trình ñoà hoïa

ª Ví duï moät chöông trình ñoà hoïa goïi thuû tuïc House

program DrawHouse;
<khai baùo House, LineNDC_, StartGraphics,...>
begin
StartGraphics;
House;
ExitGraphics
end.

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 18


ñieàu khieån chuùng
Laäp trình ñeå söû duïng laïi: moät ví duï

ª Moät giôùi haïn cuûa thuû tuïc House laø khoâng tieän söû duïng laïi
ª Tham soá hoùa thuû tuïc House ñeå deã söû duïng laïi.

procedure House2(corner : point; W, H : real);


var
Right, Top, Roof_Top, Door_Right, Door_Top, Door_Left : real;
begin
with corner do begin
Right := x + W;
Top := y + H; {toïa ñoä y lôùn nhaát cuûa vaùch}
Roof_Top := Top + H/2.0; {toïa ñoä y cuûa ñænh cao nhaát}
Door_Right := x + W/2.0;
Door_Top := y + H/2.0;
Door_Left := Door_Right - W/4.0;

Code fragment 3.3 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 19
ñieàu khieån chuùng

Laäp trình ñeå söû duïng laïi: moät ví duï (tieáp)

LineNDC_(x, y, x, Top);
LineNDC_(x , Top, Door_right, Roof_Top);
LineNDC_(Door_right, Roof_Top, Right, Top);
LineNDC_(Right, Top, Right, y);
LineNDC_(Right, y, x, y);
LineNDC_(Door_right, y, Door_right, Door_Top);
LineNDC_(Door_right, Door_Top, Door_Left, Door_Top); {veõ cöûa}
LineNDC_(Door_Left, Door_Top, Door_Left, y)
end;
end;

Code fragment 3.3 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 20
ñieàu khieån chuùng
Thuû tuïc ñöôïc tham soá hoùa

ª Ví duï duøng thuû tuïc ñöôïc tham soá hoùa House2( )

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 21


ñieàu khieån chuùng

Moâ hình vaø toïa ñoä thöïc

ª Cho ñeán baây giôø, taïo aûnh trong


– frame buffer (duøng DD_Line( ))
– NDC (duøng LineNDC( ))
ª Laäp moâ hình
– Moâ hình cho ñoái töôïng hay heä thoáng
ª Coâng cuï: phöông trình vi phaân,...

– Moâ hình hình hoïc (geometric model)


ª hình daïng, kích thöôùc, thuoäc tính khaùc

– Heä toïa ñoä thöïc (world coordinate system)


ª ñieåm trong maët phaúng coù toïa ñoä (x, y)

ª ñôn vò chieàu daøi: mm, m,...

– Muïc ñích: töø moâ hình suy dieãn ñöôïc haønh vi cuûa ñoái töôïng hay
heä thoáng.
Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 22
ñieàu khieån chuùng
Moâ hình vaø toïa ñoä thöïc

ª Vieäc nhìn (viewing): quaù trình veõ moät pheùp nhìn (view) cuûa moâ hình
leân moät thieát bò. Ba vaán ñeà:
– Phaàn naøo cuûa moâ hình/ñoái töôïng caàn ñöôïc veõ?
– Veõ ôû ñaâu treân thieát bò?
– Veõ lôùn côõ naøo? (Bieán ñoåi toïa ñoä thöïc sang NDC)

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 23


ñieàu khieån chuùng

Cöûa soå vaø vuøng nhìn

ª Pheùp nhìn (view) ñöôïc xaùc ñònh bôûi


– Cöûa soå (window): phaàn cuûa moâ hình caàn ñöôïc veõ
– Vuøng nhìn (viewport): phaàn trong NDC maø cöûa soå ñöôïc aùnh xaï leân.

Heä toïa ñoä thöïc NDC


1.
R

Vuøng nhìn
Cöûa soå

1.

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 24


ñieàu khieån chuùng
Cöûa soå vaø vuøng nhìn (tieáp)

ª Cöûa soå vaø vuøng nhìn coù caùc caïnh song song vôùi caùc truïc toïa ñoä (tröø khi ñöôïc
yeâu caàu khaùc)
ª Kích thöôùc vaø vò trí cuûa cöûa soå laø tuøy yù
ª Vuøng nhìn phaûi naèm trong NDC
ª Heä soá tyû leä cuûa cöûa soå vaø vuøng nhìn khoâng caàn phaûi baèng nhau.

Heä toïa ñoä thöïc NDC


1.

R
Cöûa soå

Vuøng nhìn

1.
Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 25
ñieàu khieån chuùng

AÙnh xaï töø cöûa soå tôùi vuøng nhìn

ª Pheùp aùnh xaï: ( x, y ) α ( dx, dy ) thoõa bieåu thöùc tuyeán tính vaø aûnh
cuûa W laø V
dx = sx x + tx
dy = sy y + ty
Heä toïa ñoä thöïc dy NDC
y
V
W l: left Vt
Wt r: right
(x, y) b: bottom
(dx, dy)
t: top
Wb
Vb
x dx
Wl Wr Vl Vr

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 26


ñieàu khieån chuùng
Xaùc ñònh caùc heä soá cuûa aùnh xaï töø cöûa soå tôùi vuøng nhìn

ª Khi x = Wl thì dx = Vl , do ñoù


Vl = sxWl + tx Heä thoáng phöông trình baäc nhaát
ª Khi x = Wr thì dx = Vr , do ñoù vôùi 2 aån soá sx vaø tx
Vr = sxWr + tx

ª Töông töï, coù ñöôïc heä thoáng phöông trình baäc nhaát vôùi 2 aån soá sy vaø ty
Töø ñoù xaùc ñònh ñöôïc sy vaø ty .

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 27


ñieàu khieån chuùng

Caùc heä soá cuûa aùnh xaï töø cöûa soå tôùi vuøng nhìn

Vr − Vl
sx =
Wr − Wl
Vt − Vb
sy =
Wt − Wb

VlWr − WlVr
tx =
Wr − Wl
VbWt − WbVt
ty =
Wt − Wb

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 28


ñieàu khieån chuùng
Kieåu döõ lieäu cho cöûa soå vaø vuøng nhìn

ª Kieåu döõ lieäu cho hình chöõ nhaät

type rect = record {hình chöõ nhaät}


l, t, r, b : real {l: left, t: top, r: right, b: bottom}
end

ª Caøi caùc tham soá cuûa hình chöõ nhaät


procedure SetRect(left, top, right, bott : real; var r : rect);
{set boundary of rectangle}
begin
with r do begin
l := left; t := top; r := right; b := bott
end
end;

Code fragment 3.4 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 29
ñieàu khieån chuùng

Hieän thöïc aùnh xaï töø cöûa soå leân vuøng nhìn

ª Cho cöûa soå W vaø vuøng nhìn V, thuû tuïc sau xaùc ñònh caùc heä soá cuûa
aùnh xaï töø W leân V:

procedure MapRects(W, V : rect; var sx, tx, sy, ty : real);


{tính sx, sy, tx, ty töø caùc tham soá cuûa caùc hình chöõ nhaät}
...
sx := (V.r - V.l)/(W.r - W.l);
tx := ...
sy := ...
ty := ...

ª AÙnh xaï ñieåm trong toïa ñoä thöïc pWorld : point ñeán ñieåm NDC : point

pNDC.x := sx*pWorld.x + tx;


pNDC.y := sy*pWorld.y + ty

Code fragment 3.5 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 30
ñieàu khieån chuùng
Veõ ñoaïn thaúng

ª Veõ ñoaïn thaúng trong toïa ñoä thöïc leân thieát bò


procedure Line(p1, p2 : point)
{Veõ ñoaïn thaúng noái p1 vaø p2 trong toïa ñoä thöïc}
var
pNDC1, pNDC2 : point; {caùc ñieåm bieân cuûa ñoaïn thaúng trong NDC}
begin
Clip(p1, p2, vis); {remove if no clipping desired}
if vis then {remove if no clipping desired}
begin {Caùc bieán sx, sy, tx, ty laø toaøn cuïc}
pNDC1.x := sx*p1.x + tx;
pNDC1.y := sy*p1.y + ty;
pNDC2.x := sx*py.x + tx;
pNDC2.y := sy*py.y + ty;
LineNDC(pNDC1, pNDC2)
end
end;

Code fragment 3.7 Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 31
ñieàu khieån chuùng

Xeùn (clipping) ñoaïn thaúng

ª Caét ñi caùc phaàn cuûa ñoaïn thaúng naèm ngoaøi cöõa soå
ª Baøi toaùn: xeùn ñoaïn thaúng sao cho phí toån thôøi gian thaáp.

Window

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 32


ñieàu khieån chuùng
Xeùn (clipping) ñoaïn thaúng (tieáp)

ª Thuû tuïc Clip(var p1, p2 : point; var vis : boolean)


– xeùn ñoaïn thaúng noái p1 vaø p2 (toïa ñoä thöïc) ñoái vôùi cöûa soå
– neáu vis laø true thì giao cuûa ñoaïn p1p2 vaø cöûa soå laø ≠ ∅, vaø caùc
ñieåm bieân ñöôïc tröõ trong p1 vaø p2
– neáu vis laø false thì giao cuûa ñoaïn p1p2 vaø cöûa soå laø ∅.

ª Cho moãi ñoaïn thaúng, Clip( ) seõ:


– khoâng laøm gì caû, neáu caû ñoaïn thaúng naèm trong cöûa soå
– khöû noù, neáu caû ñoaïn thaúng naèm ngoaøi cöûa soå
– caét moät ñieåm bieân, neáu ñoaïn thaúng coù moät ñieåm bieân naèm trong
vaø moät ñieåm bieân naèm ngoaøi cöûa soå
– caét caû hai ñieåm bieân, neáu caû hai ñieåm bieân cuûa ñoaïn thaúng naèm
ngoaøi cöûa soå, nhöng moät phaàn ñoaïn thaúng naèm trong cöûa soå.

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 33


ñieàu khieån chuùng

Quan heä trong/ngoaøi giöõa ñieåm vaø hình chöõ nhaät

ª Quan heä trong/ngoaøi giöõa ñieåm bieân vaø cöõa soå

c.r false c.r true


type half_space_code = record
l, t, r, b : boolean W
end;

procedure Encode(p : point; var c : half_space_code);


{build code for point p}
begin
c.l := (p.x < W.l);
c.r := (p.x > W.r);
c.b := (p.y < W.b);
c.t := (p.y > W.t)
end;

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 34


ñieàu khieån chuùng
Caét ñoaïn thaúng ñoái vôùi moät caïnh cuûa cöûa soå

ª Xaùc ñònh toïa ñoä cuûa A


° Toïa ñoä x cuûa A: W.r

° Toïa ñoä y cuûa A: p1.y - (p1.x - W.r)*m

W p1
W.t
A d
W.b e
p2
x
W.l W.r

° Töông töï cho caùc caïnh khaùc cuûa cöûa soå

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 35


ñieàu khieån chuùng

Giaûi thuaät clipping cuûa Cohen-Sutherland

ª Xeùn ñoaïn thaúng noái p1 vaø p2 trong toïa ñoä thöïc


procedure Clip(var p1, p2 : point; var vis : boolean);
{vis laø true neáu sau khi xeùn, phaàn coøn laïi ≠ ∅}
var
c1, c2, tmp_cd : half_space_code;
tmp_pt : point;
m : real; {heä soá goùc cuûa ñoaïn thaúng}
in1, in2, done : boolean;
{cheùp procedure Encode( ) vaøo ñaây}
begin {Clip}
done := false;
vis := false;
repeat
Encode(p1, c1);
Encode(p2, c2);

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 36


ñieàu khieån chuùng
Giaûi thuaät clipping cuûa Cohen-Sutherland (2)
in1 := (not c1.l) and (not c1.t) and
(not c1.r) and (not c1.b)
in2 := (not c2.l) and (not c2.t) and
(not c2.r) and (not c2.b)
if in1 and in2 then begin {ñoaïn thaúng naèm trong}
done := true;
vis := true
end
else if (c1.l and c2.l) or (c1.r and c2.r) or (c1.t and c2.t) or
(c1.b and c2.b) then begin {ñoaïn thaúng naèm ngoaøi}
done := true;
vis := false
end
else begin {ít nhaát moät ñieåm bieân naèm ngoaøi}
if in1 then begin {trao ñoåi p1, p2 vaø c1, c2 : baûo ñaûm p1 naèm ngoaøi}
tmp_cd := c1; c1 := c2; c2 := tmp_cd;
tmp_pt := p1; p1 := p2; p2 := tmp_pt
end;
Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 37
ñieàu khieån chuùng

Giaûi thuaät clipping cuûa Cohen-Sutherland (3)

if p2.x = p1.x then begin {ñoaïn thaúng ñöùng}


if c1.t then p1.y := w.t {p1 naèm treân}
else if c1.b then p1.y := w.b {p1 naèm döôùi}
end
else begin {khoâng phaûi laø ñoaïn thaúng ñöùng}
m := (p2.y - p1.y)/(p2.x - p1.x); {heä soá goùc}
if c1.l then begin
p1.y := p1.y + (w.l - p1.x)*m;
p1.x := w.l
end
else if c1.r then begin
p1.y := p1.y + (w.r - p1.x)*m;
p1.x := w.r
end

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 38


ñieàu khieån chuùng
Giaûi thuaät clipping cuûa Cohen-Sutherland (4)

else if c1.b then begin


p1.x := p1.x + (w.b - p1.y)/m;
p1.y := w.b
end
else if c1.t then begin
p1.x := p1.x + (w.t - p1.y)/m;
p1.y := w.t
end
end {khoâng phaûi laø ñoaïn thaúng ñöùng}
end {ít nhaát moät ñieåm bieân naèm ngoaøi}
until done
end; {Clip}

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 39


ñieàu khieån chuùng

Xeùn ñoaïn thaúng trong tröôøng hôïp xaáu nhaát

ª Giaûi thuaät Cohen-Sutherland coù theå caàn ñeán 4 laàn caét.


– Thöù töï caét trong ví duï laø A, C, B, D.

B p2
D

A
p1

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 40


ñieàu khieån chuùng
Baøi thí nghieäm/thöïc haønh 2

ª 1. Hieän thöïc caùc thuû tuïc LineNDC_( ) vaø LineNDC( ) cho maøn hình
coù kích thöôùc cao = 640 vaø roäng = 480 pixel. Caùc thuû tuïc caàn taän
duïng ñöôïc caû maøn hình.
ª 2. Hieän thöïc thuû tuïc Clip( ).

Chöong 3: Caùc thieát bò ñoà hoïa vaø söï 41


ñieàu khieån chuùng

You might also like