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

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

description

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 - PowerPoint PPT Presentation

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

Page 1: 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

Page 2: 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

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

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)

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

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;

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

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.

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

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.

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

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

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

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

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

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

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

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

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

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ò

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

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

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

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

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

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}

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

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.

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

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)

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

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)

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

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;

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

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.

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

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;

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

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;

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

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( )

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

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.

Page 24: Caùc thieát bò ñoà hoïa vaø söï ñieàu khieån chuù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ò.

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

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å

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

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å

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

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

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

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

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

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

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

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;

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

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

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

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;

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

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å

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

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å.

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

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;

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

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

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

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);

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

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;

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

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

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

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}

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

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

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

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( ).