Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån chuùng
description
Transcript of Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån chuùng
Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån chuùng
13.9.2004 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
2
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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
3
Pen plotter
ª Heä thoáng toïa ñoä
(0, 0)
caây vieát
x
y
(1023, 767)
Code fragment 2.1 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
4
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;
begindx := 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
endend;
p. 37 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
5
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ò.}
x
y
(x1, y1)
(x2, y2)
Display
1.
1.
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
6
Ví duï veõ aûnh duøng LineNDC_( )
ª Veõ hình chöõ nhaät leân thieát bò
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}
x
y
(x1, y1)
(x2, y2)
Display
1.
1.
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
7
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ò
x
y
Display
1.
1.
x
yP
Q
dx
dy
NDC
Hình vuoânglôùn nhaát
DCydy
BAxdx
),(),( dydxyx
thieát bòNDC
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
8
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)ª Ví duï: kích thöôùc thieát bò laø 1024 768.
x
y
Hình vuoânglôùn nhaát
1.
1.
dx
dy
NDC
1023
767
895128xmax
ymax
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
9
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:
x
y
Hình vuoânglôùn nhaát
1.
1.
dx
dy
NDC
1023
767
895128xmax
ymax
0.
ydy
xdx
767
128767
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
10
AÙnh xaï NDC vaøo moät thieát bò (tieáp)
ª Tröôøng hôïp ymax xmax . Ñaët offset = (xmax ymax) 2 thì
x
yHình vuoânglôùn nhaát
1.
1.
dx
dy
NDC
xmax
ymax
0.
dx = ymax x offsetdy = ymax y
offset
Code fragment 2.3 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
11
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;
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;
phuï thuoäc thieát bò
phuï thuoäc thieát bò
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
12
AÙnh xaï töø NDC leân toaøn thieát bò
ª 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ò?
x
y
1.
1.NDC
R
RNDC Rdev
Heä soá tyû leä laø R
R = Heä soá tyû leä (cuûa moät hình chöõ nhaät) = roängcao
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
13
AÙnh xaï töø NDC leân toaøn thieát bò (tieáp)
x
y
1.
1.NDC
R
RNDC Rdev
Heä soá tyû leä laø R < 1.
dx = xmax xdy = xmax yDCydy
BAxdx
0
Giaûi phaùp: Chæ söû duïng moät phaàn thích hôïp cuûa NDC
ÖÙng duïng phaûi bieát heä soá tyû leä R
Code fragment 2.4 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
14
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.6 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
15
Polyline
ª polyline: chuoãi caùc ñoaïn thaúngª Kieåu döõ lieäu bieåu dieãn polyline
polypoint = recordnum : 0..MaxVert; {number of points}pt : array [1..MaxVert] of point
end;
procedure PolylineNDC(poly : polypoint);{Veõ polyline poly}var i : integer;begin
with poly do if num > 1 thenfor i := 1 to (num - 1) do LineNDC(pt[i], pt[i + 1])
end;
x
y
1.
1.
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
16
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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
17
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)
Code fragment 3.1 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
18
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;
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
19
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.
Code fragment 3.3 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
20
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 beginRight := 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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
21
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;
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
22
Thuû tuïc ñöôïc tham soá hoùa
ª Ví duï duøng thuû tuïc ñöôïc tham soá hoùa House2( )
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
23
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( ) hay 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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
24
Moâ hình vaø toïa ñoä thöïc (tieáp)
ª 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)ª Tieâu chí khi ñaëc taû vieäc nhìn: ít phuï thuoäc thieát
bò.
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
25
Cöûa soå vaø vuøng nhìn
1.
ª 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. Ñaëc taû vuøng nhìn trong NDC ñeå ít phuï thuoäc thieát
bò.1.
R
Vuøng nhìn
NDCHeä toïa ñoä thöïc
Cöûa soå
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
26
Cöûa soå vaø vuøng nhìn (tieáp)
1.
ª 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.
1.
R
Vuøng nhìn
NDCHeä toïa ñoä thöïc
Cöûa soå
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
27
AÙnh xaï töø cöûa soå tôùi vuøng nhìn
ª Pheùp aùnh xaï: 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
WWt
Wb
Wl Wr
VVt
Vb
Vl Vr
(x, y) (dx, dy)
x
y
dx
dyHeä toïa ñoä thöïc NDC
l: leftr: rightb: bottomt: top
),(),( dydxyx
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
28
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
ª Khi x = Wr thì dx = Vr , do ñoù
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 .
Heä thoáng phöông trình baäc nhaátvôùi 2 aån soá sx vaø tx
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
29
Caùc heä soá cuûa aùnh xaï töø cöûa soå tôùi vuøng nhìn
bt
bty
lr
lrx
WW
VVs
WW
VVs
bt
tbtby
lr
rlrlx
WW
VWWVt
WW
VWWVt
Code fragment 3.4 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
30
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
ª Caøi caùc tham soá cuûa 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
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 endend;
Code fragment 3.5 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
31
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:
ª AÙnh xaï ñieåm trong toïa ñoä thöïc pWorld : point ñeán ñieåm NDC : point
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 := ...
pNDC.x := sx*pWorld.x + tx;pNDC.y := sy*pWorld.y + ty
Code fragment 3.7 Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
32
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)
endend;
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
33
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.
Cöõa soå
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
34
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ø .
ª Vôùi ñoaïn thaúng caàn ñöôïc xöû lyù, 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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
35
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å
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;
W
c.r truec.r false
type half_space_code = recordl, t, r, b : boolean
end;
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
36
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
° Töông töï cho caùc caïnh khaùc cuûa cöûa soå
p1
p2
W
W.rW.l
d
e
x
y
W.t
W.b
A
d
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
37
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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
38
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
endelse 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
endelse 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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
39
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}
endelse 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
endelse if c1.r then begin
p1.y := p1.y + (w.r - p1.x)*m;p1.x := w.r
end
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
40
Giaûi thuaät clipping cuûa Cohen-Sutherland (4)
else if c1.b then beginp1.x := p1.x + (w.b - p1.y)/m;p1.y := w.b
endelse if c1.t then begin
p1.x := p1.x + (w.t - p1.y)/m;p1.y := w.t
endend {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öông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
41
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.
p1
p2
A
B
C
D
Chöông 3: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån
chuùng
42
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( ).