Professional Documents
Culture Documents
Khoa CNTT
W X
Gio trnh
Chng I: Cc yu t c s ca ho
I. Cc khi nim c bn
I.1. Thit b ho v im nh (Pixel)
Cc thit b ho thng dng nh mn hnh my tnh, my in, cho php
chng ta biu din cc hnh v trn . Cc thit b ho ny to ra mt phng,
l mt tp hu hn cc im m mi im c nh mt cp ch s nguyn gi
l to , thng thng mt phng ho do thit b to ra l mt ma trn im,
mi im gi l mt Pixel c cc thnh phn to l x v y.
(Hnh I.1)
y=a*x+b
vi
a: l h s gc hay cn gi l dc, n phn nh mi tng quan gia 2
bin s x v y.
b: l khong chn trn trc honh
Phng trnh ng thng i qua 2 im A(xa,ya) v B(xb,yb) l:
y ya
x xa
=
y b y a xb x a
(II.a)
x = xb x a
y = y b y a
th (II.a) tr thnh y =
a =
y = ax + b vi
x
b = ax a + y a
y
y
x
xa + y a
x
x
(II.b)
y b
x
x
(hay x =
y a + xa )
y
a
y
y
V im (Round(x),y).
V d: Cho A(5,4) n B(10,7) v on thng AB ta thc hin cc bc sau:
Tnh
x = xb x a = 10 5 = 5
y = y b y a = 7 4 = 3
y 3
a =
=
x 5
b = ax a + y a = 1
=> y = ax+b = 4;
V im (5,4)
Khi x = 6:
V im (6,5)
Khi x = 7:
V im (7,5)
Khi x = 8:
V im (8,6)
Khi x = 9:
V im (9,6)
Khi x = 10:
=> y = 7;
V im (10,7)
3
10
xi+1=xi+1
xi+1
P
yi
d1
M
d2
yi+1
Q
d1=yM-yP;
d2=yQ-yM
Xt biu thc:
y P + yQ
Nu gi I l trung im ca QP th: d1 d 2 = 2[ y M y I ]
R rng l:
Nu d1-d2<0 th im yM<yI, suy ra P gn im M hn Q, vy ta s chn im P
l im minh ha cho M trn thit b ho
Nu d1-d2>0 th im yM>yI, suy ra Q gn im M hn P, vy ta s chn im
Q l im minh ha cho M trn thit b ho
Nu d1-d2=0 th im yM=yI, suy ra kh nng la chn P v Q l nh nhau,
song ta phi quyt nh chn mt im. Trong tnh hung ny ta quyt nh
chn im Q.
Vy tm c im minh ho tip theo ta cn xt du ca biu thc d1-d2. Song
ta thy biu thc d1-d2 cn kh phc tp v phi thc hin tnh ton trn trng s
thc do trong c xut hin php chia:
yM=(axi+b)+a = (axi + (ax a + y a )) + a =
y
y
y
xi
xa + y a +
x
x
x
(*)
trnh tnh biu thc d1-d2 trn trng s thc ngi ta hng ti mt biu thc
tng ng v du l
Pi = x(d1 d 2 )
Thay yM bi gi tr (*) ta c:
Pi = 2yxi 2yxa + 2xya + 2y 2xyi x
= 2yxi 2xyi 2yxa + 2xya + 2y x
(a)
(b)
6
(xi+1,yi+1)=(xi+1,yi)
Thay vo (b) ta c:
Pi +1 = 2y ( xi + 1) 2xyi 2yx a + 2xy a + 2y x
= Pi + 2y
(xi+1,yi+1)=(xi+1,yi+1)
Thay vo (b) ta c:
Pi +1 = 2y ( xi + 1) 2x( y i + 1) 2yxa + 2xy a + 2y x
= Pi + 2y 2x
Bc 1:
Tnh x;y
7
Const1=2y; Const2=2y-2x
P0=2y-x; (x0, y0) = (xa , ya)
V im (x0, y0)
Bc 2: Vi mi gi tr i (i=0,1,2,) ta xt du Pi
Nu Pi <0: th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi)
Pi+1=Pi+Const1
Ngc li (tc Pi 0): th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi+1)
Pi+1=Pi+Const2
V im (xi+1,yi+1) va tm c
Bc 3: Lp li bc 2 vi nhng gi tr i tip theo, cho n khi im tm c
trng vi B, ngha l xi+1=xb th thut ton kt thc.
II.2.b.
V d:
x = 10-5 = 5;
y = 10-6 = 4;
Const1 = 2y = 8; Const2 = 2y-2x = 8-10 = -2;
(x0, y0) = (xa , ya) = (5,6)
P0 = 2y-x = 8-5 = 3;
V im (x0, y0)
Bc 2: Bc lp:
i = 0:
Ta c P0 = 30 nn:
(x1,y1) = (x0+1,y0+1) = (6,7)
P1=P0+Const2 = 3+(-2)=1
V im (x1, y1) = (6,7)
i = 1:
Ta c P1 = 10 nn:
(x2,y2) = (x1+1,y1+1) = (7,8)
P2=P1+Const2 = 1+(-2)= -1
V im (x2, y2) = (7,8)
8
i = 2:
Ta c P2 = -1<0 nn:
(x3,y3) = (x2+1,y2) = (8,8)
P3=P2+Const1 = -1+8 = 7
V im (x3, y3) = (8,8)
i = 3:
Ta c P3 = 70 nn:
(x4,y4) = (x3+1,y3+1) = (9,9)
P4=P3+Const2 = 7+(-2) = 5
V im (x4, y4) = (9,9)
i = 4:
Ta c P4 = 50 nn:
(x5,y5) = (x4+1,y4+1) = (10,10)
P5=P4+Const2 = 5+(-2) = 3
V im (x5, y5) = (10,10)
V x5 = xb = 10 nn kt thc vng lp v cng l kt thc thut ton.
Hnh v minh ha:
6
10
10
II.2.c.
Ci t thut ton
10
X2+Y2=R2
Trong mc ny ta ch cn tm
phng php v ng trn tm ti gc
to . Nu ta v c ng trn tm
ti gc to th bng cch thm vo
php tnh tin ta c ng trn tm
(x,y) bt k.
y ta thy v c ng trn
tm gc to ta ch cn tm phng
php v cung mt phn tm AB, v vi cc php ly i xng ta s c cc phn
cn li ca ng trn.
Vi cung AB th r rng dc ca n thuc on [-1,0]. iu ny ta c th
d dng thy qua gc ca tip tuyn vi cung AB hay qua o hm phng
trnh biu din cung AB.
V cung AB c dc trong khong [-1,0], nn ta suy ra rng trn ton b
cung AB khi bin s x tng th bin s y gim, v tc thay i ca y chm
hn ca x. T y ta c th ra mt quy trnh dng cung AB l:
Cho bin s x nhn ln lt cc gi tr nguyn t xa n xb. Vi mi gi tr x ta
thc hin:
Tm gi tr y nguyn tng ng im c to nguyn (x,y) s l im
gn nht im (x,ycircle) thuc ng trn
V im (x,y) tm c v cc i xng ca n c c ng trn
Trong mc ny ta s i tm hiu 2 thut ton cho php dng ng trn (thc
cht l dng cung AB v cc i xng ca n) mt cch hiu qu v mt tc
.
xi+1=xi+1
ng thi v trn cung AB khi x tng th y gim v tc thay i ca y
chm hn ca x, nn r rng ta thy l vi gi tr x tng 1 th gi tr y s gim
i mt lng -1y0. M im chn bc trc l (xi,yi) nn im chn tip
theo (xi+1,yi+1) ch c th l mt trong hai im P(xi+1,yi) v Q(xi+1,yi-1).
xi
xi+1
yi-1
I
yi
Cung AB
P
Vi mt im M(x,y) th r rng ta c:
K
>0
<0
f circle ( x, y ) = x 2 + y 2 R 2
M
R
(a)
12
(b)
1 5
= R
4 4
1
l mt gi tr thc s lm
4
cho vic tnh cc gi tr P tip theo cng phi x l trn trng s thc. Mt
iu d thy l nu ta thay i gi tr P0 khi u l 1-R th du ca P0 v cc Pi
c c sau khng h thay i v du (mt d c b gim mt lng 0.25)
do kt qu thut ton khng h b thay i, song cc tnh ton gi tr P ch
phi tnh trn trng s nguyn.
III.1.a. Tm tt thut ton v ng trn MidPoint :
Bc 1: P0 = 1 R; (x0,y0)=(0,R)
13
V im (x0,y0)
Bc 2: Vi mi gi tr i (i=0,1,2,) ta xt du Pi
Nu Pi<0: th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi)
Pi+1=Pi+ 2xi +3
Ngc li (tc Pi 0): th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi -1)
Pi+1=Pi + 2(xi - yi) +5
V im (xi+1,yi+1) va tm c
Bc 3: Lp li bc 2 vi nhng gi tr i tip theo, cho n khi ta v c
im nguyn gn nht vi B, ngha l xi+1 = Trunc(xb) = Trunc (
R
2
) th thut
ton kt thc.
III.1.b. Ci t
Sinh vin cn xy dng mt th tc v ng trn theo thut ton trnh by
trn.
14
15
d1=yP2 - y2
P
d2=y2 - yQ2
(a)
(b)
17
) th thut
ton kt thc.
III.2.b. Ci t
Sinh vin cn ci t mt th tc v ng trn theo thut ton Bresenham v
chng trnh s dng th tc v cc ng trn ngu nhin.
A(0,b)
C(x0, y0)
B(a,0)
x2 y2
+
=1
a2 b2
(I)
Mt khc do dc ca d l:
x0 b 2
= 1 nn ta suy ra
y0 a 2
18
b4 2
( y ta c x0 0) => y = 4 x0
a
(a)
2
0
x 02 y 02
+
=1
a2 b2
a2
a2 + b2
v y 0 =
(b)
b2
a2 + b2
d1=yP2 - y2
P
d2=y2 - yQ2
= [yP +
(yi-1)2 -
yQ2
- 2y ]a = [
yi2
b 2 ( a 2 xi+2 1 )
+ (yi-1) - 2(
)]a2 = [yi2 +
2
a
2
2b 2 ( a 2 ( xi + 1) 2 ) 2
]a
a2
(a)
(b)
20
Pi+1
= y02 .a2 + (y0-1)2 .a2 - 2b2a2 + 2b2(x0 +1)2 =b2a2 +(b-1)2a2 -2a2b2 + 2b2
= b2a2 +a2b2 -2a2b +a2 -2a2b2 +2b2 = -2a2b +a2 +2b2
= a2(1-2b) + 2b2
IV.1.a.
21
a2
a2 + b2
) th
Ch :
Tm tt thut ton trn ch p dng cho on AC. dng on BC ta cn
c s thay i vai tr ca ca x v y cng nh a v b. C th dng c
cung BC cn hon i trong ton b thut ton: x thnh y v y ngc li
thnh x, a thnh b v b ngc li thnh a.
V thut ton ch v n Trunc(xc) nn nu phn l ca xc ln hn 0.5 (v d
Trunc(xc=7.65)=7). Nu iu ny c thc hin trn c 2 cung AC v BC
th s dn n hnh nh ghp ni ca 2 cung l cung AB s thiu 1 im ti
C. trnh trnh trng ny th chng ta c th p dng Trunc() trn mt
cung, cn cung cn li p dung Round().
IV.1.b. Ci t thut ton Bresenham cho dng Ellipse
Sau y l mt chng trnh v d cho thut ton. Chng trnh ci t th tc v
Ellipse c tn l Bre_Ellipse theo thut ton trnh by trn, v chng trnh s
dng th tc Bre_Ellipse v cc hnh Ellipse mt cch ngu nhin.
uses graph,crt;
procedure init;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,' ');
ErrCode := GraphResult;
if ErrCode <> grOk then
begin Writeln('Graphics error:', GraphErrorMsg(ErrCode));readln;halt end;
end;
procedure Bre_Ellipse(xt,yt:Integer;A,B:longint);
var x,y,P,Const1, Const2:longint; color:byte;
Procedure Put(x,y:integer);
begin
putpixel(x+xt,-y+yt,color);
putpixel(x+xt,y+yt,color);
putpixel(-x+xt,-y+yt,color);
putpixel(-x+xt,y+yt,color);
22
end;
begin
Color:=Getcolor;
{Ve cung AC}
const1:=trunc(sqr(a) / sqrt(sqr(a)+sqr(b)));
x:=0;y:=b;P:=a*a*(1-2*b)-2*b*b;put(x,y);
repeat
if p<0 then
p:=p+2*b*b*(2*x+3)
else
begin
p:=p+2*b*b*(2*x+3)+4*a*a*(1-y);
y:=y-1;
end;
x:=x+1;
put(x,y);
until x=const1;
{Ve cung BC}
{const2:=trunc(sqr(b) / sqrt(sqr(a)+sqr(b)));}
Const2:=Const1+1;
{ Thay v qu trnh lp c xt trn y, chng ta c th lm iu tng t bng cch
xt trn x. Bit rng trn ton b cung AB th x s bin thin t 0 n a, m trc
khi dng cung AC ta cho x bin thin trong on [0, Const1], vy trn cung BC x
phi bin thin trong on [Const1+1, a ] th s m bo hai cung AC v CB ghp ni
lin tc vi nhau. }
y:=0;x:=a;P:=b*b*(1-2*a)-2*a*a;put(x,y);
repeat
if p<0 then
p:=p+2*a*a*(2*y+3)
else
begin
p:=p+2*a*a*(2*y+3)+4*b*b*(1-x);
x:=x-1;
end;
y:=y+1;
put(x,y);
until x=const2;
end;
var a,b:longint;
BEGIN
init;
randomize;
repeat
a:=random(100)+50;b:=random(100)+50;
setcolor(random(15)+1);
Bre_Ellipse(getmaxx div 2,getmaxy div 2,a,b);
23
until readkey=#27;
closegraph;
END.
V. Bi
tp cui chng
24
I. i nt v cu trc mn hnh mu
25
26
II. Cc h mu
Trn cc thit b hin th nh mn hnh my tnh, mn hnh Tivi v phn ln
cc thit b hin th mu thng dng khc ngi ta chn 3 mu Red, Green v Blue
biu din tt c cc mu sc khc nhau ca hnh nh, cng nh ngi ho s
ch dng mt s mu c bn song cc bc tranh c v ra li rt phong ph v
mu sc. Mt cu hi t ra l ti sao li chn 3 mu trn m khng phi l mt
nhm mu no khc. tr li cu hi ny chng ta hy tm hiu qua v cu to
mt ngi.
Mt con ngi chng ta cm nhn mu sc thng qua cc t bo vng m
hnh nn. Ba mu Red, Green v Blue c mt con ngi cm nhn r nht,
chng c bc song di ln lt l 580nm, 545nm v 440nm. S ho trn ca 3
bc sng ny s cho ta c nhng mu sc khc. Nm 1981 The Commission
International de lEclairage (gi tt l CIE) xy dng mt chun l tt c cc
mu nn xy dng thng qua thnh phn mu chnh l Red, Green v Blue.
Chun ny u tin c xy dng cho cc h v tuyn truyn hnh v ngay
c trong cc my tnh. D nhin khng phi tt c cc mu u c th biu din
thng qua 3 thnh phn ny, nhng hu ht tt c u c th chuyn c.
Hiu nay khng phi ch c h mu RGB m cn c nhng h khc nh:
HSV, HSL, YIQ, v mt h mu mi y l h HVC (Hue, Value, Color). By gi
chng ta hy xem xt tng h mt.
II.1. H RGB
RGB l ch vit tt ca 3 t Red, Green v Blue. H ny c min khng
gian gi tr l mt khi 3 chiu. Mi mu xc nh trn 3 thnh phn l R, G, B. S
gia gim cc thnh phn ny s to ra cc mu sc khc nhau to nn mt khng
gian mu.
Cng ca mi thnh phn R,G,B c m ho trong cc mc khc
nhau. C cc mc m ho kh ph bin l: M ho 16, 64 v 256 mc. Hin nay
mc m ho 256 mc l ph bin (t 0 n 255). Nu cng ca mi thnh
phn c m ho trong 256 mc th cn 8bt m ho, vy mt mu biu din
bi 3 thnh phn RGB s lu tr bi 24 bt, ch ny thng c gi l ch
my thc (True color -24 bit) bi v n c th biu bin n khong 16,7 triu
mu.
27
Blue(0,0,255)
Mageta
(255,0,255)
Black(0,0,0)
Red
(255,0,0)
Cyan
(0,255,255)
White
(255,255,255)
Green
(0,255,0)
Yellow
(255,255,0)
II.2. H mu CMY
l 3 ch vit tt Cyan (mu lc lam), Magenta (mu ti), Yellow.
Cng thc chuyn i t h RGB sang h CMY nh sau:
C = 1-R
M = 1-G
Y = 1-B
28
II.3. H mu HSV
29
30
RGBtoHSV
USES
Math,
// MaxValue
IEEE754, // NaN, IsNaN
SysUtils; // Exception
TYPE
EColorError = CLASS(Exception);
TReal = DOUBLE;
...
// RGB, each 0 to 255, to HSV.
// H = 0.0 to 360.0 (corresponding to 0..360.0 degrees around hexcone)
// S = 0.0 (shade of gray) to 1.0 (pure color)
// V = 0.0 (black) to 1.0 {white)
// Based on C Code in "Computer Graphics -- Principles and Practice,"
// Foley et al, 1996, p. 592.
PROCEDURE RGBToHSV (CONST R,G,B: TReal; VAR H,S,V: TReal);
VAR
Delta: TReal;
Min : TReal;
BEGIN
Min := MinValue( [R, G, B] ); // USES Math
V := MaxValue( [R, G, B] );
31
Delta := V - Min;
// Calculate saturation: saturation is 0 if r, g and b are all 0
IF
V = 0.0
THEN S := 0
ELSE S := Delta / V;
IF
S = 0.0
THEN H := NaN // Achromatic: When s = 0, h is undefined
ELSE BEGIN
// Chromatic
IF
R=V
THEN // between yellow and magenta [degrees]
H := 60.0 * (G - B) / Delta
ELSE
IF
G=V
THEN // between cyan and yellow
H := 120.0 + 60.0 * (B - R) / Delta
ELSE
IF
B=V
THEN // between magenta and cyan
H := 240.0 + 60.0 * (R - G) / Delta;
IF H < 0.0
THEN H := H + 360.0
END
END {RGBtoHSV};
HSVtoRGB
// Based on C Code in "Computer Graphics -- Principles and Practice,"
// Foley et al, 1996, p. 593.
//
// H = 0.0 to 360.0 (corresponding to 0..360 degrees around hexcone)
// NaN (undefined) for S = 0
// S = 0.0 (shade of gray) to 1.0 (pure color)
// V = 0.0 (black) to 1.0 (white)
32
THEN BEGIN
R := V;
// achromatic: shades of gray
G := V;
B := V
END
ELSE RAISE EColorError.Create('HSVtoRGB: S = 0 and H has a value');
END
ELSE BEGIN // chromatic color
IF
H = 360.0
// 360 degrees same as 0 degrees
THEN hTemp := 0.0
ELSE hTemp := H;
hTemp := hTemp / 60;
i := TRUNC(hTemp);
f := hTemp - i;
// h is now IN [0,6)
// largest integer <= h
// fractional part of h
p := V * (1.0 - S);
q := V * (1.0 - (S * f));
t := V * (1.0 - (S * (1.0 - f)));
CASE i OF
0: BEGIN R := V; G := t; B := p
1: BEGIN R := q; G := V; B := p
2: BEGIN R := p; G := V; B := t
3: BEGIN R := p; G := q; B := V
4: BEGIN R := t; G := p; B := V
5: BEGIN R := V; G := p; B := q
END
END
END {HSVtoRGB};
END;
END;
END;
END;
END;
END
(H mu Lab)
33
III.1.a. Ci t
Sau y l mt th vin ho (mang tnh minh ha) xy dng trn mode 13 hexa
vi phn gii v mu sc l 320x200x256 mu.
unit Graph_13;
Interface
{**********************************************************}
uses crt,dos;
type screen=array[0..199,0..319] of byte;
const MaxPolygon=1000;
type pointtype=record
x,y:integer;
end;
Polygo=array[1..MaxPolygon] of pointtype;
Polygon=^PolyGo;
FillPatternType = array[1..8] of byte;
FillStyle=array[1..8,1..8] of byte;
var _Scr:^screen;_Color,_BKColor,_FillColor:byte;_X,_Y:integer;
_FillPattern:FillPatternType;_Fill:FillStyle;
_Page:array[1..5] of ^screen;_CurrentPage,_CountPage:byte;
(**************************************)
procedure Init(mode:byte);
Procedure setRGB(num:byte;R,G,B:byte);
procedure SetGroupcolorRegs(starcolorReg,num:integer; segment,offset:word);
Function NewPage:byte;
Function ReleasePage(Page:byte):boolean;
Function SetActive(page:byte):boolean;
Procedure Displace(page:byte);
Function GetmaxX:integer;
Function GetmaxY:integer;
procedure setcolor(color:byte);
Function GetColor:byte;
Procedure MakeFillStyle;
procedure SetFillPattern(Pattern: FillPatternType; Color: Word);
Procedure SetfillStyle(Pattern:word;Color:byte);
Procedure MoveTo(x,y:integer);
Procedure putpixel(x,y:integer;Color:byte);
Procedure lineNgang(x1,x2,y:integer);
procedure line(x1,y1,x2,y2:integer);
Procedure LineTo(x,y:integer);
Procedure Circle(xt,yt,R:integer);
Procedure FillCircle(xt,yt,R:integer);
Procedure Bar(x1,y1,x2,y2:integer);
Procedure FillTamGiac(x1,y1,x2,y2,x3,y3:integer);
Procedure drawpoly(N:integer;A:polygon);
procedure fillpoly(N:integer;A:polygon);
procedure Fillpoly1(N:integer;A:polygon);
Procedure Spline(N:integer;P:polygon);
35
{**********************************************************}
Implementation
{**********************************************************}
procedure Init(mode:byte);
begin
asm
mov ah,0
mov al,mode
int $10
end;
if mode=$13 then
begin _scr:=ptr($a000,$0000);_X:=0;_Y:=0;
_Color:=255;_Color:=0;_FillColor:=255;
_CurrentPage:=0;_CountPage:=0;
end;
end;
Procedure setRGB(num:byte;R,G,B:byte);
(* Dat noi dung thanh ghi mau *)
var Regs:registers;mau:longint;
begin
with Regs do
begin
ah:=$10;
al:=$10;
bx:=num;
dh:=R;
ch:=G;
cl:=B;
intr($10,regs);
end
end;
procedure SetGroupcolorRegs(starcolorReg,num:integer; segment,offset:word);
(* Dat mot nhom thanh ghi mau *)
var Regs:registers;
begin
with regs do
begin
ah:=$10; al:=$12;
bx:=starcolorreg;cx:=num;
es:=segment; dx:=offset;
intr($10,regs);
end;
end;
Function NewPage:byte;
begin
if _CountPage<5 then
begin
_CountPage:=_CountPage+1;
36
Getmem(_Page[_CountPage],320*200);
NewPage:=_CountPage;
fillchar(_Page[_CountPage]^,320*200,0);
end
else
NewPage:=0;
end;
Function ReleasePage(Page:byte):boolean;
var i:byte;
begin
if (Page>0)and(Page<=_CountPage) then
begin
if (Page=_CountPage) then
Freemem(_Page[Page],320*200)
else
begin
Freemem(_Page[Page],320*200);
for i:=Page to _CountPage-1 do
_Page[i]:=_Page[i+1];
end;
_CountPage:=_CountPage-1;
ReleasePage:=true
end
else
ReleasePage:=false;
end;
Function SetActive(page:byte):boolean;
begin
if (page>0)and(page<=_CountPage) then
begin
_Scr:=@_Page[Page]^;
_CurrentPage:=Page;
end
else
if page=0 then _scr:=ptr($a000,$0000)
end;
Procedure Displace(page:byte);
begin
if (page>0)and(page<=_CountPage) then
begin
Move(_Page[Page]^,mem[$A000:0000],320*200);
end;
end;
Function GetmaxX:integer;
begin
GetmaxX:=319;
end;
Function GetmaxY:integer;
37
begin
GetmaxY:=199;
end;
procedure setcolor(color:byte);
begin
_Color:=color;
end;
Function GetColor:byte;
begin
GetColor:=_Color;
end;
Procedure MakeFillStyle;
var i,j:byte;
begin
for i:=1 to 8 do
for j:=1 to 8 do
if ((_FillPattern[i] shr (8-j)) and 1)=1 then
_Fill[i,j]:=_FillColor
else _Fill[i,j]:=_BKColor;
end;
procedure SetFillPattern(Pattern: FillPatternType; Color: Word);
begin
_FillPattern:=Pattern;
MakeFillStyle;
end;
Procedure MakePattern(Pattern:word);
var p:FillPatternType;
begin
Pattern:=Pattern mod 12;
case Pattern of
0:begin p[1]:=$0;p[2]:=$0;p[3]:=$0;p[4]:=$0;p[5]:=$0;
p[6]:=$0;p[7]:=$0;p[8]:=$0;
end;
1:begin p[1]:=$ac;p[2]:=$bc;p[3]:=$ce;p[4]:=$ee;p[5]:=$ff;
p[6]:=$fe;p[7]:=$1;p[8]:=$f1;
end;
2:begin
end;
3:begin
end;
4:begin
end;
5:begin
end;
6:begin
end;
7:begin
end;
8:begin
end;
38
9:begin
end;
10:begin
end;
11:begin
end;
end;
_FillPattern:=P;
MakeFillStyle;
end;
Procedure SetfillStyle(Pattern:word;Color:byte);
begin
_FillColor:=Color;MakePattern(Pattern);
end;
Procedure MoveTo(x,y:integer);
begin
_X:=x;_Y:=y;
end;
Procedure putpixel(x,y:integer;Color:byte);
begin
_Scr^[y,x]:=Color;
end;
{************** Thu tuc LineNgang **************}
procedure lineNgang(x1,x2,y:integer);
var segment,ofset,l:word;tam:integer;
begin
if x1>x2 then begin tam:=x1;x1:=x2;x2:=tam end;
segment:=seg(_Scr^[y,x1]);ofset:=ofs(_Scr^[y,x1]);l:=x2-x1+1;
ASM
push ES
mov DI,ofset
mov AX,segment
mov ES,AX
mov AL,_Color
mov CX,l
cld
rep stosb
pop ES
end;
end;
{************** Ket thuc Thu tuc LineNgang **************}
{************** Thu tuc Line **************}
procedure line(x1,y1,x2,y2:integer);
{************** Thu tuc hoan doi 2 dau mut **************}
procedure HoanDoiDau(var x1,y1,x2,y2:integer);
var tg:integer;
begin
tg:=x1;x1:=x2;x2:=tg;
tg:=y1;y1:=y2;y2:=tg;
39
end;
{************** Than cua thu tuc Line **************}
var P,dtx,dty,const1,const2,i:longint;segment,ofset,l:word;
begin
dtx:=x2-x1;dty:=y2-y1;
if dtx=0 then
begin
if y1>y2 then begin i:=y1;y1:=y2;y2:=i end;
for y1:=y1 to y2 do _Scr^[y1,x1]:=_Color;
end
else
if dty=0 then linengang(x1,x2,y1)
else
if (dty*dtx>0)and(abs(dty)<=abs(dtx)) then
begin {Line (0,1]}
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[y1,x1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[y1,x1]:=_Color;
p:=p+const1;
end
else
begin
y1:=y1+1;
_Scr^[y1,x1]:=_Color;
p:=p+const2;
end;
end;
end
else
if (dtx*dty>0) then
begin {Line (1,vocung)}
HoanDoiDau(x1,x2,y1,y2);
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[x1,y1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[x1,y1]:=_Color;
p:=p+const1;
40
end
else
begin
y1:=y1+1;
_Scr^[x1,y1]:=_Color;
p:=p+const2;
end;
end;
end
else
if (abs(dty)<=abs(dtx)) then
begin {Line [-1,0)}
y1:=-y1;y2:=-y2;
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[-y1,x1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[-y1,x1]:=_Color;
p:=p+const1;
end
else
begin
y1:=y1+1;
_Scr^[-y1,x1]:=_Color;
p:=p+const2;
end;
end;
end
else
begin{Line (-1,am vo cung)}
HoanDoiDau(x1,x2,y1,y2);
y1:=-y1;y2:=-y2;
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[x1,-y1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[x1,-y1]:=_Color;
p:=p+const1;
end
else
41
begin
y1:=y1+1;
_Scr^[x1,-y1]:=_Color;
p:=p+const2;
end;
end;
end;
end;
{************** Ket thuc Thu tuc Line **************}
{************** Thu tuc LineTo **************}
Procedure LineTo(x,y:integer);
begin
Line(_X,_Y,x,y);_X:=x;_Y:=y;
end;
{************** Ket thuc Thu tuc LineTo **************}
{************** Thu tuc Circle **************}
procedure Circle(xt,yt,R:integer);
var x,y,p:integer;mau:byte;s1:string;t,t1,t2:real;ch:char;
procedure putdiem(c,h:integer);
begin
_Scr^[h+yt,c+xt]:=_Color;
_Scr^[c+yt,h+xt]:=_Color;
_Scr^[-h+yt,-c+xt]:=_Color;
_Scr^[-c+yt,-h+xt]:=_Color;
_Scr^[h+yt,-c+xt]:=_Color;
_Scr^[c+yt,-h+xt]:=_Color;
_Scr^[-h+yt,c+xt]:=_Color;
_Scr^[-c+yt,h+xt]:=_Color;
end;
begin
P:=1-r;
putdiem(0,R);x:=0;y:=R;
while x<y do
begin
if p<0 then
p:=p+2*x+3
else
begin
p:=p+2*(x-y)+5;
y:=y-1;
end;
x:=x+1;
putdiem(x,y);
end;
end;
{**************Ket thu Thu tuc Circle **************}
{************** Thu tuc FillCircle **************}
procedure FillCircle(xt,yt,R:integer);
var x,y,p:integer;mau:byte;s1:string;t,t1,t2:real;ch:char;
42
procedure LineScan4(c,h:integer);
begin
line(c+xt,h+yt,-c+xt,h+yt);
line(c+xt,-h+yt,-c+xt,-h+yt);
line(h+xt,c+yt,-h+xt,c+yt);
line(h+xt,-c+yt,-h+xt,-c+yt);
end;
begin
P:=1-r;
LineScan4 (0,R);x:=0;y:=R;
while x<y do
begin
if p<0 then
p:=p+2*x+3
else
begin
p:=p+2*(x-y)+5;
y:=y-1;
end;
x:=x+1;
LineScan4 (x,y);
end;
end;
{************** Ket thu Thu tuc FillCircle **************}
{************** Thu tuc Bar **************}
Procedure Bar(x1,y1,x2,y2:integer);
var tam:integer;
begin
if y1>y2 then begin tam:=y1;y1:=y2;y2:=tam end;
for tam:=y1 to y2 do lineNgang(x1,x2,tam);
end;
{************** Ket thuc Thu tuc Bar **************}
{************** Thu tuc FillTamGiac **************}
Procedure FillTamGiac(x1,y1,x2,y2,x3,y3:integer);
procedure FillFlatTop(x1,x2,x3,y1,y2,y3:integer);
{Qui dinh y1=y2}
var X1_Change_Per_Pixel,X2_Change_Per_Pixel,x1_now,x2_now:real;y:integer;
begin
X1_Change_Per_Pixel:=(x3-x1)/(y3-y1);
X2_Change_Per_Pixel:=(x3-x2)/(y3-y2);
x1_now:=x1;x2_now:=x2;
for y:=y1 to y3 do
begin
linengang(round(x1_now),round(x2_now),y);
x1_now:=x1_now+X1_Change_Per_Pixel;
x2_now:=x2_now+X2_Change_Per_Pixel;
end;
end;
procedure FillFlatBottom(x1,x2,x3,y1,y2,y3:integer);
{Qui dinh y1=y3}
43
var X1_Change_Per_Pixel,X2_Change_Per_Pixel,x1_now,x2_now:real;y:integer;
begin
X1_Change_Per_Pixel:=(x2-x1)/(y2-y1);
X2_Change_Per_Pixel:=(x3-x2)/(y3-y2);
x1_now:=x2;x2_now:=x2;
for y:=y2 to y1 do
begin
linengang(round(x1_now),round(x2_now),y);
x1_now:=x1_now+X1_Change_Per_Pixel;
x2_now:=x2_now+X2_Change_Per_Pixel;
end;
end;
procedure Sap(var x1,y1,x2,y2:integer);
var tam:integer;
begin
if y1>y2 then
begin
tam:=y1; y1:=y2; y2:=tam;
tam:=x1; x1:=x2; x2:=tam;
end;
end;
var x4,y4:integer;
begin
if (y1=y2)and(y2=y3) then
begin linengang(x1,y1,x2);linengang(x1,y1,x3);exit; end;
sap(x1,y1,x2,y2);sap(x1,y1,x3,y3);sap(x2,y2,x3,y3);
if y1=y2 then
FillFlatTop(x1,x2,x3,y1,y2,y3)
else
if y2=y3 then
FillFlatBottom(x2,x1,x3,y2,y1,y3)
else
begin
y4:=y2;x4:=x1+round((x3-x1)*(y2-y1)/(y3-y1));
FillFlatBottom(x2,x1,x4,y2,y1,y4);
FillFlatTop(x2,x4,x3,y2,y4,y3);
end;
end;
{************** Ket thuc Thu tuc FillTamGiac **************}
{************** Thu tuc Spline **************}
Procedure Spline(N:integer;P:polygon);
procedure tinh(u:real;var Pu:Pointtype;P:Polygon;K:integer);
const t=0;
var u2,u3,s:real;
begin
u2:=u*u;u3:=u2*u;s:=(1-t)/2;
Pu.x:=round(P^[k-1].x*(-s*u3+2*s*u2-s*u)+P^[k].x*((2-s)*u3+(s-3)*u2+1)
+P^[k+1].x*((s-2)*u3+(3-2*s)*u2+s*u)+P^[k+2].x*(s*u3-s*u2));
Pu.y:=round(P^[k-1].y*(-s*u3+2*s*u2-s*u)+P^[k].y*((2-s)*u3+(s-3)*u2+1)
+P^[k+1].y*((s-2)*u3+(3-2*s)*u2+s*u)+P^[k+2].y*(s*u3-s*u2));
44
end;
Procedure TaoDuLieu(N:integer;P:polygon;var Pt:Polygon);
begin
Getmem(Pt,sizeof(pointtype)*(N+2));
move(P^,Pt^[2],n*sizeof(pointtype));Pt^[1]:=Pt^[2];Pt^[n+2]:=Pt^[n];
end;
{************** Than Thu tuc Spline **************}
var u,Bn:real;Pu:Pointtype;bd:boolean;
k:integer;Pt:polygon;
Begin
TaoDuLieu(n,p,pt);
{for k:=2 to n+1 do
with Pt^[k] do
bar(round(x)-3,round(y)-3,round(x)+3,round(y)+3);}
Bn:=1/(20);bd:=true;
for k:=2 to n do
begin
u:=0;
repeat
tinh(u,Pu,Pt,K);
if bd then
begin
moveto(round(Pu.x),round(Pu.y));
bd:=false;
end
else
lineto(round(Pu.x),round(Pu.y));
u:=u+bn;
until U>1;
end;
Freemem(Pt,sizeof(pointtype)*(N+2));
End;
{************** Ket thuc Thu tuc Spline **************}
Procedure drawpoly(N:integer;A:polygon);
var i:integer;
begin
for i:=1 to N-1 do
line(A^[i].x,A^[i].y,A^[i+1].x,A^[i+1].y);
If (A^[1].x<>A^[n].x)and(A^[1].y<>A^[n].y) then
line(A^[1].x,A^[1].y,A^[n].x,A^[n].y);
end;
{************** Thu tuc FillPoly **************}
procedure Fillpoly1(N:integer;A:polygon);
var i,j,ymid,min,max,chiso,detal:integer;tam:pointtype;ch:char;
daui,dauj:shortint;
begin
if n=1 then putpixel(A^[1].x,A^[1].y,_Color)
else
if n=2 then line(A^[1].x,A^[1].y,A^[2].x,A^[2].y)
45
else
begin
min:=A^[1].y;max:=A^[1].y;
for i:=2 to n do
begin
if A^[i].y<min then min:=A^[i].y;
if A^[i].y>max then max:=A^[i].y;
end;
ymid:=(min+max) div 2;chiso:=1;detal:=abs(A^[1].y-ymid);
for i:=2 to n do
if detal >abs(A^[i].y-ymid) then
begin detal:=abs(A^[i].y-ymid); chiso:=i; end;
i:=chiso;
if chiso<>n then j:=chiso+1 else j:=1;
while (j<>chiso) do
begin
if (i<n) then i:=i+1 else i:=1;
if (j<n) then j:=j+1 else j:=1;
FillTamGiac(A^[chiso].x,A^[chiso].y,A^[i].x,A^[i].y,A^[j].x,A^[j].y);
ch:=readkey;
end;
end;
end;
{************** Thu tuc FillPoly **************}
procedure fillpoly(N:integer;A:polygon);
type diemcat=record
x:real;
canhthu:byte;
end;
type dlcanh=record
y_top:integer;
x :integer;
delta_y :integer;
x_change_per_scan:real;
end;
dsc=array[1..MaxPolygon] of dlcanh;
DSCanh=^dsc;
{*********************************************}
procedure taodscanh(var A:polygon;n:integer;var B:dscanh;var m:integer);
var i:integer;
begin
Getmem(B,sizeof(Pointtype)*n);
for i:=1 to n-1 do
begin
if A^[i].y<A^[i+1].y then
begin B^[i].y_top:=A^[i].y;B^[i].x:=A^[i].x end
else
begin B^[i].y_top:=A^[i+1].y;B^[i].x:=A^[i+1].x end;
B^[i].delta_y:=abs(A^[i].y-A^[i+1].y);
46
47
48
49
I. Trng hp F l mt tp hu hn im
Trong trng hp ny bi ton tng ng vi vic tm mt thut ton
xc nh mt im ca F c nm trong min D hay khng. Bi ton ny c
gii quyt khi D l mt a gic khng t ct trong R2, Khi D l mt a din khng
t ct trong R3, Khi D l hnh trn, hnh cu,...
ymax
A(xa, ya)
ymin
B(xb, yb)
xmin
xmax
x x x max
D = ( x, y ) R 2 min
v
y min y y max
x = x A + ( x B x A )t
2
F = ( x, y ) R y = y A + ( y B y A )t
0 t 1
50
xmin x A + ( x B x A )t xmax
y min y A + ( y B y A )t y max
0 t 1
(II.1)
Th ClipD(AB)=CD
Thut ton trn va i hi phi tnh ton v lng gi nhiu trn cc s thc.
Trong thc t ngi ta dng mt thut ton khc hiu qu hn. y chung ta s
xem xt n cc thut ton nh Cohen-Sutherland, thut ton chia nh phn, hay
mt thut ton c ci bin v gt gia t thut ton tng qu trn vi tn gi l
thut ton Liang-Barsky
II.1.a.
B
A
51
1000
1010
0001
0000
0010
0101
0100
0110
Bng quy tc nh m
bt 3
bt 2
bt 1
bt 0
Trn
Di
Phi
Tri
1 nu x p > x max
Bt1 =
0 nung-c li
1 nu y p < y min
Bt2 =
0 nung-c li
1 nu y p > y max
Bt3 =
0 nung-c li
52
xD=xA
Nu m(B)=0000 th yD=yB
B
Ngc li th:
yD=ymax nu BTrn=1
yD=ymin nu BDi=1
ClipD(AB)=CD
Khi xAxB, Khi AB l mt on thng nm xin. t C=A, D=B. Bi v C
nm bn ngoi hnh ch nht nn quy trnh xn c thc hin nh sau:
B
53
Hng dn: Cng thc tnh giao im ca CD vi cc cnh Tri, Phi, Trn,
Di c th c suy ra t phng trnh biu din CD v cc cnh ca hnh
ch nht:
Phng trnh AB:
y yA
x xA
y yA x xA
;
=
hay
=
y
y B y A xB x A
x
y
( xmin x A ) + y A ). Cng thc
x
Sau y l mt hm tnh m
Function Ma(x,y,xmin,ymin,xmax,ymax:integer):Byte;
Var m:byte;
Begin
m:=0 {m=0000}
If x<xmin then m:=m or 1; {Tc m or 0001 Bin, t bt 0 bng 1}
If x>xmax then m:=m or 2; {Tc m or 0010 Bin, t bt 1 bng 1}
If y<ymin then m:=m or 4; {Tc m or 0100 Bin, t bt 2 bng 1}
If y>ymax then m:=m or 8; {Tc m or 1000 Bin, t bt 3 bng 1}
Ma:=m;
54
End;
II.1.a.iii.
Ci t thut ton
Thut gii ny xut pht t t tng ca phng php "gii phng trnh
bng phng php chia nh phn"
T tng ca thut gii nh sau: ly trung im ca on thng v kim tra
m ca n loi dn cc on con khng cha giao im, v cui cng cho im
gia hi t v giao im ca on thng vi hnh ch nht, kt qu l ta thu c
on con nm trong hnh ch nht (nu c)
Thut ton c phc tho nh sau:
i/ Nu m(A)=0000 v m(B)=0000 th ClipD(AB)=AB
ii/ Nu m(A)=0000 v m(B)0000 th:
t C:=A; D:=B;
while |xC-xD|+|yC-yD|1 do
begin
ly trung im M ca CD
+ Nu m(M)0000 th
D:=M
+ Ngc li:
C:=M
end;
ClipD(AB)=AC
iii/ Nu m(A)0000 v m(B)=0000:
i vai tr ca A v B ri p dng ii/
iv/ [Nu m(A)&m(B)]0000 th ClipD(AB)=
v/ Nu m(A)0000 v m(B)0000 v [m(A)&m(B)]=0000
t C:=A; D:=B;
Ly trung im M ca CD
55
While (m(M)0000)and(|xC-xD|+|yC-yD|1) do
begin
+ Nu m(M)&m(C)0000 th C:=M
iv/}
+ Ngc li (tc m(M)&m(C)=0000) th D:=M {on DM
ngoi, t chng minh}
Ly trung im M ca CD
end;
+ Nu m(M)0000 th ClipD(AB)=
+ Ngc li: p dng ii/ cho cc on MA v MB ta c
ClipD(MA)=MA1
ClipD(MB)=MB1
Suy ra ClipD(AB)=A1B1
II.1.b.i.
Ci t thut ton
x=xB-xA
y=yB-yA
P1=-x
Q1=xA-xmin
P2= x
Q2=xmax-xA
P3=-y
Q3=yA-ymin
P4= y
Q4=ymax-yA
0 t 1
k = 1,2,3,4
(II.1.c)
Xt cc trng hp sau:
56
k K 1 U {1}
Pk
U1= min
K2={k | Pk<0}
Qk
k K 2 U {0}
Pk
U2= max
Nu U1<U2 th ClipD(AB)=
Ngc li: th [U2, U1] chnh l on nghim ca h bt phng trnh trn
(tng ng vi [t1,t2] m phng php tng qut nu). Nn gi C,D l hai
im tho
xC = x A + x.U 1 ; y C = y A + y.U 1
x D = x A + x.U 2 ; y D = y A + y.U 2
Th ClipD(AB)=CD
II.1.c.i.
Ci t thut ton
ii/ Xc nh ClipD'(A'B')
iii/ S c hai tnh hung xy ra:
Nu ClipD'(A'B')= th kt qu ClipD(AB)=.
Ngc li nu ClipD'(A'B')=C'D' th quay C'D' mt gc ta c CD. Suy ra
ClipD(AB)=CD
57
Kt qu thu c
Hnh ch nht D
(Clipping Window)
(hnh 1)
(hnh 1.a)
(hnh 1.b)
(hnh 1.c)
(hnh 1.d)
58
59
Bc 2: T mu cho im P(x0,y0)
Bc 3: Xc nh cc im ln cn Ti (i=1..4) c mu OldColor (cng mu vi P
trc khi t)
Bc 4: Xem Ti nh vai tr ca P v thc hin li t bc 1.
Kt lun: Thut ton trn s dng khi khng xc nh c Ti tt c cc ln
quy.
IV.1.a.i.
Ci t thut ton
LoangMauDeQuy(x,y:integer; NewColor:byte);
Var OldColor:byte;
Begin
OldColor:=GetPixel(x,y)
if OldColor=NewColor then
exit
else
begin
PutPixel(x,y,NewColor);
If (x>0) and (GetPixel(x-1,y)=OldColor) then
LoangMauDeQuy(x-1,y,NewColor);
If (x<GetMaxX) and (GetPixel(x+1,y)=OldColor) then
LoangMauDeQuy(x+1,y,NewColor);
If (y>0) and (GetPixel(x,y-1)=OldColor) then
LoangMauDeQuy(x,y-1,NewColor);
If (y<GetMaxY) and (GetPixel(x,y+1)=OldColor) then
LoangMauDeQuy(x,y+1,NewColor);
end;
End;
61
Nhc im ca phng php quy l khng thc hin c khi vng loang c
din tch ln (dn n trn Stack).
IV.1.b. Phng php khng quy
Trn c s ca tng trn song c xy dng li trnh gi quy lm
hn ch khng gian t
Bc 1: Khi to mt hng i Q vi phn t u tin l P(x0,y0). Gi OldColor l
mu ca im P (OldColor=Color(P))
Bc 2: Khi hng i khng rng th: ly ra t hng i Q mt im T.
Nu mu hin thi ca T l OldColor th:
+ T mu im T
+ Tm cc im ln cn ca T c mu l OldColor v a chng vo hng
i Q.
Bc 2 ny c lp i lp li cho n khi hng i Q rng.
danhsach=record
x,y:integer;
next:DS;
end;
var dau,cuoi:ds;maucu:byte;
Procedure Push(x,y:integer);
Var P:DS;
begin
New(P);P^.x:=x;P^.y:=y;P^.next:=nil;
If Dau=nil then
Dau:=P
else
Cuoi^.next:=P;
Cuoi:=p;
end;
Procedure Pop(Var x,y:integer);
Var P:DS;
begin
P:=Dau; Dau:=Dau^.next;
x:=P^.x; y:=P^.y;
dispose(p);
end;
begin
maucu:=getpixel(x,y);
if maucu=maumoi then exit;
Dau:=Nil;Push(x,y);
while (dau<>nil) do
begin
Pop(x,y);
if (getpixel(x,y)=maucu)and(maxavail>sizeof(ds)) then
begin
putpixel(x,y,maumoi);
if (x>0)and(getpixel(x-1,y)=maucu) then
Push(x-1,y);
if (x<getmaxx)and(getpixel(x+1,y)=maucu) then
Push(x+1,y);
if (y>0)and(getpixel(x,y-1)=maucu) then
Push(x,y-1);
if (y<getmaxy)and(getpixel(x,y+1)=maucu) then
Push(x,y+1);
end;
end;
end;
BEGIN
init;
rectangle(50,50,480,380);
line(50,50,155,370);line(155,370,165,55);
63
loangmau(60,60,4);
readln;
closegraph;
END.
x1
x2
x2x3
x2x3
x4
x4
Scan-line 1
x5 Scan-line 2
V d:
64
65
66
tp cui chng
67
a b
(Qx, Qy) = (Px, Py).
+ (trx, try)
c d
Q = P.M + Tr
vi
Q=(Qx,Qy); P=(Px,Py);
(I)
Tr = (trx,try)
68
Qy = s y Py
Di dng ma trn:
s
M= x
0
Vi:
0
v
s y
Tr = (0,0)
sx l h s t l theo trc x
sy l h s t l theo trc y
3 4
12
Php ng dng (hay cn gi l php bin i t l) cho php chng ta phng to hay thu
nh hnh theo mt hay hai chiu m vn gi c hnh dng c bn ca chng (ng
dng).
1 2
12
0 1
i xng qua Oy
1 0
0 1
i xng qua Ox
1 0
0 1
i xng qua gc ta
69
Ch :
Tm ca php quay c xt y l gc ta .
v Tr = (0,0)
Trong :
tx : l h s bin dng theo trc x.
ty : l h s bin dng theo trc y.
b
d
try
0
1
K hiu (Qx, Qy, 1), (Px, Py, 1) c gi l to Homogen, v cng thc ca php bin
i theo to Homogen l:
Q = P.T
Vi T l ma trn 3x3 c gi l ma trn bin i.
70
= P.M + Tr
Nh vy tng hp (hay tch) ca hai php bin i Affine cng l mt php bin
i Affine, c cc ma trn bin i l:
M = M1.M2 v Tr = Tr1.M2 + Tr2
Nu s dng to Homogen th:
Q = P.T1;
Suy ra:
W = Q.T2
W = (P.T1).T2 = P.T
vi T = T1.T2
php quay
Ma trn Homogeneous
1
0
tr
x
0
1
try
0
1
Cos ( ) Sin( ) 0
Sin( ) Cos ( ) 0
0
0
1
1 0 0
0 1 0
0 0 1
1 0 0
0 1 0
0 0 1
71
1 0 0
0 1 0
0 0 1
php ng dng
sx
0
0
0
sy
tx
0
ty
1
0
0
1
0
0
1
T= 0
V
x
0
1
Vy
0 Cos ( ) Sin ( ) 0 1
0 . Sin ( ) Cos ( ) 0 . 0
1
0
0
1 V x
0
1
Vy
0
1
I.9. Cc v d minh ha
I.9.a.
V d 1:
Gii: Php quay quanh im M mt gc 90o c biu din qua 3 php bin i c
bn ln lt l:
+ Tnh tin theo vector MO = (xO-xM, yO-yM) = (0-3, 0-3) = (-3, -3):
0 0
1
72
0
0
1 0 0 1
T = T1.T2 .T 3= 0
1 0 1 0 0 0 1 0 = 1 0 0 0 1 0 = 1 0 0
3 3 1 0 0 1 3 3 1 3 3 1 3 3 1 6 0 1
0 0 1 0 1 0 6 0 1
B1
6
5
C1
M
A1
I.9.b.
B6
V d 2:
73
Gii:
a) Php ly i xng qua CD c phn tch thnh tch ca 3 php bin i c bn
sau:
1. Php tnh tin theo vector v1 = (0,-4) (tnh tin CD v trng vi trc OX)
1 0 0
Ma trn T1 = 0 1 0
0 4 1
Ma trn T2 = 0 1 0
0 0 1
Ma trn T3 = 0 1 0
0 4 1
T4 = T1 xT2 xT3 = 0 1 0
0 8 1
0
0
1 0 0 1
Ta = T4 xT5 = 1 0 0
8
0 1
8 7
7 0 1
=
x 1 0 0 =
4 6
6 4 1
0 1
4 4 1 8
4 4
1
1
74
yQ
yQ
O
r
v
yP
O
r
v
P
yP
xQ
xP
xQ
xP
r
Ta thy khi tnh tin hnh P theo vector v ta c hnh Q, y c gi l php bin i
r
thun. Ngc li, khi ta tnh tin h trc ta OXY theo vector v ta c h trc ta
mi OXY. Lc ny, ta ca hnh P trong h trc OXY tng ng ta ca hnh
Q trong h ta OXY:
Hay
POXY = QOXY
(a)
0 0
1 0
v y 1
m QOXY = POXY T vi T = 0
v
x
1
1
suy ra: QOXY .T = POXY .T .T = POXY (b)
t (a) v (b) suy ra:
1
1
-1
QO ' X 'Y ' = QOXY .T vi T = 0
v
x
0
1
vy
0
1
75
I.11. Ci t
Sinh vin cn xy dng cc th tc tm ma trn ca cc php bin i c bn
Z
Y
O
Y
X
O
H gin tip
H trc tip
Thng thng, ta lun lun nh v mt im trong khng gian qua h trc tip.
P(x,y,z)
P(R,,)
R
H ta -ct
H ta Cu (Pole)
76
t 21 t 22 t 23 0
t
t
t
0
31 32 33
tr tr tr 1
y
z
II.2.a.
0
Ma trn ca php tnh tin theo vector Tr = (trx, try, trz) l:
0
tr
x
II.2.b.
0
1
0
0
0
1
try
trz
0
0
Php bin i t l
0 sy 0 0
T =
0 0 sz 0
0 0 0 1
Trong :
sx : h s t l theo trc X
sy : h s t l theo trc Y
sz : h s t l theo trc Z
II.2.c.
Php i xng
0
0
0 0
1 0
0 1
0 0
0
0
1
77
II.2.d.
1 0
0 1
0 0
0 0
1 0
0 1
0 0
0 0
0 0
0 0
1 0
0 1
0 0
0 0
1 0
0 1
Php quay
Ta nhn thy rng, nu php quay quay quanh mt trc no th thnh phn ta
ng vi trc ca vt th s khng thay i. Do , ta c ma trn ca cc php quay
nh sau:
Cos ( ) Sin( ) 0 0
Sin( ) Cos ( ) 0 0
Quay quanh trc Z:
0
0
1 0
0
0
0 1
0
0
1
0 Cos ( ) Sin( )
0 Sin( ) Cos ( )
0
0
0
0
0
Cos ( )
0
Sin( )
0
0
0 Sin( )
1
0
0 Cos ( )
0
0
78
Y
P(x,y,z)
y' P
(0,0,E)
Z
Mt
E
Mt phng
chiu
Gi s P nm pha trc mt, tc l P.z < E. Phng trnh tham s ca tia chiu i qua P
c vit:
E*(1-t) + P*t vi tR
Hay vit c th l:
P(t) = (0,0,E).(1-t) + (x,y,z).t (*)
Vi P(t) l im trn tia chiu ph thuc vo tham s t.
x P = 0(1 t ) + x.t
x = xP =
x
1 z / E
1
z
1
E
y = yP =
y
1 z / E
Nhn xt
79
Y
X
X
Z
Mt phng chiu
(s c th hin ln mn hnh)
Y
X
Y
X
Z
Mt phng chiu
(s c th hin ln mn hnh)
80
Z1
Z
Y
X
O
Y1
Z
O
X1
Y
0
1
0 0
0
1
0
A=
=
0
0
1 0
0
0
1
0
0
Z2
Gc quay
Z
Y
X
O
Y1
Z
O
Y2
X2 X1
X
Ta gi Rz l ma trn ca php quay quanh trc Z mt gc a
Cos (a ) Sin(a ) 0 0
Sin(a) Cos(a) 0 0
Rz =
0
0
1 0
0
0
0
1
81
0
0
0
0
1
0
0
0
Cos ( ) Sin( ) 0 0
B=
v h (OX1,Y1,Z1) bin i thnh h (OX2,Y2,Z2).
0
0
1 0
0
0
0 1
Y3
Gc Quay
Z2
Y
X
O
Z3
O
Y2
X3
Y
X
Ta c:
0
0
1
0
0
0
0 -1
R x=
0
0
0
1
0
0
0
0
0
82
0
0
1
0 Sin( ) Cos( )
C=
0 Cos( ) Sin( )
0
0
0
0
0
X3
Y
X
1
0
D=
0
0
1
0
0
0
0
1
0
0
v h (OX3Y3Z3) bin i thnh h (OXYZ).
0
Tm li
T=
0
Sin( )
0
Cos ( )
0
0
1
R
Cui cng ta c:
(x, y, z, 1) = (x, y, z, 1).T
hay:
x = -x.Sin() + y.Cos()
y = -x.Cos().Sin() - y.Sin().Sin() + z.Cos()
z = -x.Cos().Cos() - y.Sin().Cos() - z.Sin() + R
83
y'
P(x,y,z)
O
P(x,y)
O
D
Mt chiu
Z
X
P(x,y,z)
Mt chiu
x'
P(x,y,z)
X
Cho mt im P(x,y,z) v hnh chiu ln mt phng chiu ca n l P(x,y).
gi D l khong cnh t mt phng chiu n mt (gc ta ).
Xt cc tam gic ng dng, ta c:
x/x = D/z
v
y/y = D/z
hay x= x.D/z
v
y= y.D/z
Ch : ni mt cch khc l to x v y c nhn vi mt h s D/z. Nn nu z>D
th kt qu l thu nh (hay hi t) ngc li khi z<D th kt qu c phng ln.
Phng to
Thu nh
Mt
Vt th
Mn hnh
Mn hnh
84
x = x
y = y
KT LUN
IV.3. Ci t
Sinh vin cn xy dng mt th tc cho php chuyn to ca i tng t h to
trc tip sang h to quan st.
Xy dng mt th tc cho php chiu vt th t h to quan st ln mt phng
quan st theo php chiu song song hay phi cnh ri v kt qu chiu ln mn hnh.
Xy dng chng trnh s dng 2 th tc trn minh ho hnh nh ca mt hnh
hp. Nng cao hn sinh vin cn theo i cc gc v chng trnh c th th
hin c hnh hp t nhiu gc .
IV.4. V d minh ha
Vit chng trnh m t php quay ca mt hnh lp phng quanh cc trc.
V. Bi tp cui chng
1. Ci t thut ton xn mt on thng vo mt hnh ch nht c cnh khng
song song vi trc ta .
2. Vit chng trnh v mt Ellipse c cc trc khng song song vi h trc ta
.
3. Da vo bi tp 2, hy m phng qu trnh quay ca mt Ellipse xung quanh
tm ca n.
4. M phng qu trnh quay, tnh tin ca mt hnh bt k trong mt phng quanh
trc ta .
5. M phng chuyn ng ca tri t xung quanh mt tri ng thi m t
chuyn ng ca mt trng xung quanh tri t.
6. Vit chng trnh v ng h ang hot ng.
7. Vit chng trnh v cc khi a din u trong khng gian.
85
86
P(t ) = Pk BkL (t )
k =0
L!
(1 t ) L k t k
k!( L k )!
,vi k L
87
Mi a thc Bernstein c bc l L.
Thng thng ta cn gi cc BkL(t) l cc hm trn. Bi ta c th hiu vect P(t)
nh l mt s pha trn ca cc vct P0,P1,,PL vi mt t l nht nh theo cng
thc Bernstein cc gi tr t khc nhau gia 0 v 1.
P1
P2
P1
P0
P1
P0
P11
P0
P12
P03
P21
P01
P0
P2
ng cong Bezier bc 2
P0
P3
ng cong Bezier bc 3
P (u , v ) = Pi , k BiM (u ) BkL (v )
i =0 k =0
88
P0
P
L
1
L
L
L
L
L
P (t ) = Pk Bk (t ) = B0 (t ) B1 (t ) B2 (t ) L BL (t ) P2 = B L (t ) PT
k =0
M
PL
0
0
0
0
1
3
0
3
Bez 3 =
3 6
3
1
3 3
Ni suy c cc im u v im cui:
Tht vy:
L
P(t ) = Pk BkL (t )
k =0
89
Khi ly gi tr t tin n 0 th ta c:
L
L
L
L
Lim+ (P(t ) ) = Lim+ Pk BkL (t ) = Lim+ Pk BkL (t ) = Pk Lim+ BkL (t ) = Pk Lim+ BkL (t )
k = 0 t 0
k = 0 t 0
t 0
t 0
k =0
k = 0 t 0
M ta thy:
( )
t 0
t 0
t 0
L!
Lim+ (B0L (t ) ) = Lim+ (CL0 (1 t ) L 0 t 0 ) = Lim+
(1 t ) L 0 t 0 = Lim+ ((1 t ) L 0 t 0 )
t 0
t 0
t 0 0! L!
t 0
= Lim+ ((1 t ) L ) Lim+ (t 0 ) = Lim+ ((1 t ) L ) Lim+ (1) = Lim+ ((1 t ) L ) 1 = Lim+ ((1 t ) L ) = 1
t 0
Vy:
t 0
t 0
t 0
t 0
t 0
Lim+ (P(t ) ) = P0 1 + P1 0 + P2 0 + K + PL 0 = P0
t 0
t 1
P B
k =0
L
k
(t ) .M + Tr
N: ma trn bin i
Tr: vct tnh tin
L
Xt ng cong
k =0
k =0
k =0
k =0
k =0
k =0
B
k =0
L
k
(pcm)
(t ) = 1
90
(Chng minh
B
k =0
L
k
B
k =0
L
k
(t ) = [(1 t ) + t ] = 1L = 1 ).
L
k Pk vi k 0 v
k =0
k =0
=1
B
k =0
L
k
ca cc im kim sot.
I.4.d.
o hm ca cc ng Bezier:
L
91
P (t ) = Pk G k (t )
k =0
92
P (t ) = Pk G k (t )
k =0
Theo trn ta c
L
P (t ) = Pk Rk (t )
k =0
93
P (t ) = Pk N k ,m (t )
k =0
(tng t nh mt Bezier)
* Ghi ch: Cc ng Bezier l cc ng B-Spline.
Sau y l mt cng thc cho ng cong Spline bc 3 c tn l Hermite
Spline vi cng thc sau:
P (u ) = u 3 u 2
Pk 1
P
u 1 Mc k
Pk +1
Pk + 2
vi Mc c gi l ma trn ct yu:
s
s 2 s s 2
2s s 3 3 2s s
Mc =
s
0
0
s
1
0
0
0
vi s = (1-t)/2.
P(u)
=
=
95
96
I. M hnh Wireframe:
M hnh Wireframe hay cn gi l m hnh khung dy lu tr thng tin v
hnh dng (b khung) ca i tng. Thng tin lu tr c t chc thnh 2 danh
sch, mt danh sch nh, v mt danh sch cnh c to nn t cc nh cha
trong danh sch nh. Danh sch nh lu gi to cc nh ca i tng m
mi nh bao gm cc thnh phn to (x,y,z), danh sch cnh lu gi danh sch
cc cp th t im to nn cnh m to ca cc im ny cha trong danh sch
im.
V d: lu tr hnh dng mt chic gh g th s nh hnh v sau:
Z
(-1,-1,3)
(-1,-1,2)
(1,-1,3)
(1,-1,2)
(-1,-1,0)
(1,-1,0)
X
1
(1,1,0)
1
(-1,-1,-3)
(1,-1,-3)
Danh sch nh
Stt
X
Y
Z
1
1
1
-3
2
-1
1
-3
3
-1
-1
-3
4
1
-1
-3
5
1
1
0
6
-1
1
0
7
-1
-1
0
8
1
-1
0
9
1
-1
2
10
-1
-1
2
11
1
-1
3
12
-1
-1
3
(-1,1,0)
Y
(-1,1,-3)
(1,1,-3)
97
98
end;
Trong mi cnh l mt phn t ca mng Canh, phn t Canh[i] cha hai thng
tin D1 v D2 l th t ca 2 nh trong danh sch Dinh, m hai nh to nn
cnh.
Nh trnh by trong
chng IV (Cc php bin
P(x,y,z)
i hnh hc) ta c hnh
chiu phi cnh P' ca P ln
P
mt phng OXY c cc
thnh phn to l:
x'=x/(1-z/E) v y'=y/(1-z/E)
(0,0,E)
X
Mt
Ta d dng thy rng
Z
php chiu phi cnh gn
E
Mt phng
ging vi php chiu trc
chiu
giao trc y ngoi tr x
v y c nhn ln mt h
s t=1/(1-z/E). Tha s ny th thuc vo khong cch tng i E gia mt nhn
v mt phng chiu, v n s lm cho vt th (hay thnh phn) gn mt th c
hnh dng to ra cn nhng vt th (hay thnh phn) xa th c hnh dng nh li.
II.2.a.
Ci t thut ton
Sau y l chng trnh minh ho vic s dng m hnh WireFrame biu
din mt vt th l mt chic gh c m t u chng, ng thi chng
trnh cn ng dng kin thc ca chng Cc php bin i hnh hc, cho
php ngi quan st c th quan st vt th mi gc cnh nh chng trnh
thit lp h quan st v cho php ngi s dng quay h quan st bng cch dng
cc phm mi tn.
Program View_3D_Object;
100
{Khi to ch ho}
var gd,gm,errorcode:integer;
begin
gd:=detect;
initgraph(gd,gm,'c:\bp\bgi\');
errorcode:=graphresult;
if errorcode<>grok then
writeln('graphics error');
end;
Procedure KhoiTaoGhe(var Wi:WireFrame);
101
{Thc hin chiu trc giao ln mt phng chiu song song vi OXY ri nh x ln
mn hnh}
var i:byte;
xg,yg:integer;
dx:real;
begin
xg:=getmaxx div 2;
yg:=getmaxy div 2;
with wic do
for i:=1 to socanh do
begin
setcolor(color);
line(round(dinh[canh[i].D1].x*hesophong)+xg,
102
103
-3
-3
-3
-3
0
0
0
0
2
2
3
3
+ Xy dng chng trnh con cho php thc hin chiu phi cnh ri nh x
ln mn hnh thay th cho chng trnh con ChieuTrucGiao_Ve dng php chiu
trc giao. y chng ta dng cng thc chiu phi cnh tm ra trong chng
cc php bin i hnh hc mc Quan st vt th 3D & Quay h quan st, l
cng thc:
x= x.D/z
y= y.D/z
104
105
Mt 1
1
Mt 5
3
Mt 4
Mt 3
5
4
Mt 2
6
106
{im 3 chiu}
{Vector 3 chiu. Mc d n ging vi
Point3D song ta vn khai cc thut
ton c tng minh}
{Cu trc mu sc ca mt mt}
107
B,G,R:Byte;
end;
KieuMat=record
PhapVT:Vector3D;
Sodinh:cardinal;
List:array of integer;
Color:RGBColor;
end;
Obj3D=record
{i tng 3 chiu}
ObjName:string;
{Tn ca i tng}
Sodinh:cardinal;
{S nh}
Dinh: array of point3d; {Danh sch nh. y ta dng kiu
mng ng}
SoMat:cardinal;
{S mt}
Mat:array of KieuMat; {Danh sch mt}
Xworld,Yworld,Zworld,Zoom:Real; {To v kch thc tht
ca vt trong h to th gii}
end;
Khi ci t cho mt ng dung c th vic s dng mng c nh c th gy
ra cc tr ngi v kch thc ti a hay ti thiu, cng nh vic s dng b nh
khng ti u. V th ngoi cch dng mng c nh, ta c th dng mng ng
trong mt s ngn ng nh Visual Basic, Delphi hay Visual C++, hoc dng
cu trc danh sch mc ni. Song song vi iu l vic bt i hay a thm cc
thuc tnh cn thit biu din cc c tnh khc ca mt hay ca i tng
* Vn kh mt khut:
Khi th hin vt th 3D mt vn ny sinh l lm sao ch th hin cc mt
c th nhn thy c m khng th hin cc mt khut pha sau. Vic mt mt b
khut hay khng b khut th tu thuc vo cu trc cc mt ca vt th v v tr
ca im nhn cng nh bi cnh m vt th c t vo.
108
T nhng kinh nghim trong thc t, ngi ta cho rng nn s dng gi tr z trung
bnh s cho kt qu tt trong hu ht cc trng hp.
Nh vy, chng ta cn phi sp xp cc mt theo th t t xa n gn, ri
sau v cc mt t xa trc, ri v cc mt gn sau, nh th th cc mt gn
s khng b che khut bi cc mt xa, m ch c cc mt xa mi c th b cc
mt gn che khut, do cc mt gn v sau nn c th c v chng ln hnh
nh ca cc mt xa.
Nh vy, thut gii Depth-Sorting c thc hin mt cch d dng khi
chng ta xc nh mt gi tr su (l gi tr z trong h to quan st) i din
cho c mt. Cc mt da vo su i din ca mnh so snh ri sp xp theo
mt danh sch gim dn (theo su i din). Bc tip theo l v cc mt ln
mt phng theo th t trong danh sch.
Gii thut cn mt s vng mc sau:
Khi hai mt l ct nhau th thut gii ny ch th hin nh chng chng ln
nhau.
Hnh nh tht
Mt B
Mt A
(Hnh II.2)
109
110
111
R rng, thut ton rt n gin v phc tp tnh ton khng cao. Song
khi s dng phi lun m bo rng i tng c t tnh l c v li, nu i
tng khng tho mn iu kin th chng ta phi p dng mt thot ton khc
hay c nhng sa i cn thit trnh s th hin sai lc.
Hng dn thm:
3. p dng
115
y1,y2:Integer;
cnh (y1<=y2)}
xGiao:real;
xStep:real;
zGiao:real;
zStep:real;
{Tung bt u v kt thc ca mt
{honh xut pht ca cnh. Song
trong qu trnh tnh ton n s l tung
giao im ca cnh vi ng qut
ngang}
{Gi tr thay i ca x khi y thay i 1
n v, n cho bit dc ca cnh}
{Gi tr su ti im xut pht ca
cnh. Song trong qu trnh tnh ton n
s l gi tr su ca giao im vi
ng qut ngang}
{Gi tr su ca giao im tip theo
so vi gi tr su ca giao im trc
s chnh lch nhau mt khong l
zStep}
end;
DanhSachCanhCat_Z=array of CanhCat_Z;
{Danh sch cc
cnh c to ra t a gic chiu G, danh sch ny nhm ph v cho qu
trnh tnh ton cc giao im vi ng qut cng nh su ca mi giao
im}
GiaoDiem_Z=record {Lu to giao im v su tng ng vi
giao im }
x,y:Integer;
{To giao im}
z:real;
{Gi tr su}
ChiSoCanh:integer;
{Ch s cnh ct to ra giao im (Nhm
mc ch kh cc giao im tha)}
end;
DanhsachGiaoDiem_Z=array of GiaoDiem_Z;
{Kt thc phn khai bo phc v cho gii thut Z-buffer}
DrawObj(Obj:Obj3D;
Zmin,ZMax:Real;
Procedure
Z_Buffer:Z_BufferType;
Canvas:TCanvas;
Width,Height:integer;
Zoom:real);
{u vo: + i tng 3D cha trong Obj
+ Gii hn su trong khng gian m chng trnh x l l
t Zmin n Zmax. Ta s thc hin nh x cc gi tr su tnh c ca
cc im trn a gic sang khng gian 0..4294967294. Bit rng su
Zmin ng vi 0 v Zmax ng vi 4294967294. ( su 4294967295 lm gi
tr mc nh cho cc im nn
+ Z_Buffer: l ma trn cha su cc im nh ca cc i
tng th hin trn Canvas (xem nh l mt phng chiu). Nu ta cha
v i tng no trc th Z_Buffer c khi ng l 4294967295
Canvas: Tm vi v. Chng ta s thc hin v hnh nh ca
i tng ln Canvas.
Width,Height: L chiu rng v cao ca Canvas
116
nh
l
mt
phng
ta
c
ta
(Obj.dinh[P].y,Obj.dinh[P].x), ri sau phng theo t l l
Zoom v tnh tin theo vector (cx,cy) nhm gip a hnh nh ra
vng gia Canvas}
Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx; }
Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy;
Poly[i].Z:=((Obj.dinh[P].z-ZMin)/(ZMax-Zmin)*4294967294);
//MaxCardinal=429496729
5
{Gi tr su ca nh Poly[i] l gi tr Obj.dinh[P].z song
c nh x vo khng gian nguyn 0..4294967294}
end;
Color:=RGB(Obj.Mat[K].Color.R,Obj.Mat[K].Color.G,Obj.Mat[K].Color.
B);
FillPolygon3D(Poly,Color,Z_Buffer,CanVas);
end;
setlength(poly,0);
end;
117
Procedure
FillPolygon3D(Poly:Polygon_Z;Color:TColor;Z_Buffer:Z_BufferType;Can
vas:TCanvas);
{Th tc t mu mt a gic theo thut ton Z_Buffer}
var L,H,ND,NG,i,j,Y,MaxY,MinY:integer;
D:DanhSachCanhCat_Z;
G:DanhsachGiaoDiem_Z;
Z_BufferW,Z_BufferH:Integer;
{L,H:Gii hn ch s ca mng Poly
D:Danh sch cc cnh c to ra t Poly, cha nhng thng tin cn thit
tnh giao im v su ca giao im mt cch nhanh chng
ND: S phn t ca mng D
G: Cha danh sch cc giao im c c sau mi ln dng qut thay i
NG:s phn t ca mng G}
Procedure TaoDanhSachCanhCat;
{Th tc ny to ra danh sch D, l danh sch cc cnh ca a gic t
thng tin u vo Poly}
Var i,d1,d2,Dem,Dy,Cuoi:integer;
begin
{Xc nh s cnh ca a gic}
If (Poly[L].x<>Poly[H].x)or(Poly[L].y<>Poly[H].y) then
begin
ND:=H-L+1;
setlength(D,ND);
Cuoi:=H;
end
else
begin
ND:=H-L;
setlength(D,ND);
Cuoi:=H-1;
end;
Dem:=0;
{To ra cc cnh}
For i:=L to Cuoi do
begin
If i<H then j:=i+1 else j:=L;
{Xc nh im u v im cui ca cnh, im u l im c gi
tr y nh}
If Poly[i].y<=Poly[j].y then
begin d1:=i;d2:=j end
else
begin d1:=j;d2:=i end;
D[dem].y1:=Poly[d1].y;D[dem].y2:=Poly[d2].y; {Lu tr tung
xut pht v kt thc}
118
D[dem].xGiao:=Poly[d1].x;
D[dem].zGiao:=Poly[d1].z;
im u ca cnh}
120
Z:Cardinal;
begin
i:=0;
While i<NG-1 do
begin
K:=G[i+1].x - G[i].x;
If k<>0 then
Dz:=(G[i+1].z-G[i].z)/K
else
Dz:=0;
For x:=G[i].x to G[i+1].x do
{Vi mi on ta thc hin tnh su ca tng im ri so snh vi
gi tr c trong Z_Buffer}
begin
If (0<=x)and(x<=Z_BufferW)and(0<=y)and(y<=Z_BufferH)
then
begin
z:=round(G[i].z);
If Z_Buffer[x,G[i].y]>Z then {So snh su ca im
tnh c vi su c }
{Nu su ca im tnh c nh hn su c
trong Z_Buffer th r rng l im tnh c gn hn
im v trc trong vng m Z v Canvas}
begin
Canvas.Pixels[x,G[i].y]:=Color;
{V
im ln Canvas}
Z_Buffer[x,G[i].y]:=Z;
{Cp nht
su ca im
va v vo
vng m Z}
end;
end;
G[i].z:=G[i].z+Dz; {Gn gi tr su ca im tip theo
vo trong G[i].z}
end;
i:=i+2;
end;
end;
{Th tc chnh}
begin
{Xc nh gii hn trn v gii hn di
L:=low(Poly); H:=High(Poly);
ca Poly}
{Xc nh cc chiu ca ma trn
Z_BufferW:=high(Z_Buffer);
Z_Buffer}
rng
(t
Z_BufferH:=high(Z_Buffer[0]); {Z_BufferW+1:Chiu
0..Z_BufferW)
121
Z_BufferH+1:Chiu
cao
(t
0..Z_BufferH)}
{ Tm gi tr y ln nht v nh nht ca a gic Poly t cho dng
qut thc hin qut t trn min n max}
MaxY:=Poly[L].y;MinY:=MaxY;
For i:=L+1 to H do
if MaxY<Poly[i].y then
MaxY:=Poly[i].y
else
If MinY>Poly[i].y then
MinY:=Poly[i].y;
TaoDanhSachCanhCat;
122
I. Khi nim
Khi biu din cc i tng 3 chiu, mt yu t khng th b qua tng
tnh thc ca i tng l to bng sng cho vt th. thc hin c iu
ny, chng ta cn phi ln lt tm hiu cc dng ngun sng c trong t nhin,
cng nh cc tnh cht c trng khc nhau ca mi loi ngun sng. T a ra
cc gii php k thut khc nhau nhm th hin s tc ng ca cc ngun sng
khc nhau ln i tng.
nh sng phn x
nh sng ti
nh sng phn
nh sng ti
nh sng ti
nh sng phn x
(a)
nh sng ti
(b)
rr
a.n
Cos( ) = r r
a .n
(III.1)
124
Trong cng thc trn Cos() bng tch v hng ca a v n chia cho tch
ln ca chng. Nu ta chun ho ln ca cc vector a v n v 1 t trc th
ta c th tnh gi tr trn mt cch nhanh chng nh sau:
Cos() = tch v hng ca a v n = a.x*n.x+a.y*n.y+a.z*n.z
V gc ti c gi tr giao ng trong khong t 0 n 90o nn Cos() c gi tr t
0 n 1. Vy ta c th s dng hm Cos() nh l hm phn nh mi quan h ca
cng nh sng ti (nh sng nh hng) v nh sng phn x li, nh sau:
Cng nh sng phn x = cng ca nh sng nh hng * Cos() (III.2)
. Vy qua cng thc (III.1) v (III.3) chng ta c th tnh c cng ca nh
sng phn x trn b mt khi bit c cng ca nh sng nh hng cng
nh cc vector php tuyn ca mt v tia ti.
CuongDoSang:=AnhSangNen + AnhSangDinhHuong *
Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Obj.Mat[K].PhapV
T);
{ y cng sng m mt nhn c do ngun sng nh hng cung
cp ph thuc khng ch vo cng sng m ngun pht ra, m cn ph
thuc vo hng n nh sng ca mt v c biu din bi biu thc:
AnhSangDinhHuon*Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang
,Obj.Mat[K].PhapVT)}
R:=round(Obj.Mat[K].Color.R*CuongDoSang);
G:=round(Obj.Mat[K].Color.G*CuongDoSang);
B:=round(Obj.Mat[K].Color.B*CuongDoSang);
{Thit lp mu sc cho mt bng cch: ly cng mu sc mt nh ca
mt Obj.Mat[K].Color, nhn vi cng sng m n nhn c trong
thc t tnh ton c CuongDoSang. T ta thy, nu mt nhn c
y nh sng (cng sng =1) th mt s c mu mt nh ca n
(xc nh khi thit k i tng), ngc li th mt s c mu sc ti hn.
Nu mt khng c chiu sng t cc ngun sng (cng sng =0) th
mt s c mu en}
canvas.Brush.Color :=rgb(R,G,B);
Canvas.Pen.Color:=canvas.Brush.Color;
Canvas.Polygon(poly);
{v a gic vi mu sc c xc nh trc bi bt t (Brush.Color) v
bt v (Pen.Color)}
end;
setlength(poly,0);
end;
Nn nh rng trong tnh hng ngun sng im th chng ta buc lng phi tnh
Cos() thng qua cng thc (II.1) v vector a s thay i khi mt hay ngun sng
thay i (tr khi mt tnh, song nu mt tnh v ngun sng c nh th suy ra
chng ta ch cn tnh cng sng mt ln).
(450 mt)
(16200 mt)
128
129
130
Hin nay, trong cc tin ch to m hnh, ngi ta cho php chng ta nhp
v iu chnh hng cho cc vector nt ti cc nh ca a gic thay v tnh ni suy
t cc vector php tuyn. Nh hnh minh ha sau:
{1 nh ca a gic chiu (l nh ca mt a
gic xung mt phng OXY}
{Php vector ti 1 nh ca a gic}
{To ca nh}
131
end;
PolygonGourand =array of NutPolyGourand;
CanhCat=record
y1,y2:Integer;
xGiao:real;
XStep:real;
NGiao:Vector3D;
NStep:Vector3D;
end;
DanhSachCanhCat=array of CanhCat;
GiaoDiem=record
{Cu trc cha giao im ca ng qut
ngang vi cnh a gic chiu }
x,y:Integer;
{To giao im}
NGiao:Vector3D;
{Php vector ti giao im}
ChiSoCanh:integer;
{Ch s cnh to ra giao im}
end;
DanhsachGiaoDiem=array of GiaoDiem;
Procedure
DrawObjGouraud_FilterRearFace(Obj:Obj3D;Canvas:TCanvas;Width,Height:inte
ger;Zoom:real;
AnhSangNen,AnhSangDinhHuong:real;VectorChieuSang:vector3D;V:Vector3D);
{V i tng 3D c li v cong}
Var i,j,k,Dem,P,Q,cx,cy:integer;
Poly:PolygonGourand;
{Cha Danh sch cc mt c lin kt n mt
DinhLinkMat:array of Record
inh}
SoMat:Integer;
A:array of integer;
end;
{S mt c lin kt vi nh th i}
CMLD:array of integer;
begin
cx:=Width div 2;cy:=Height div 2;
Setlength(DinhLinkMat,Obj.Sodinh);
Setlength(CMLD,Obj.Sodinh);
For i:=0 to obj.Sodinh-1 do CMLD[i]:=0;
{Xc nh mi nh c bao nhiu mt lin kt n}
132
{T a gic Poly theo thut ton t a gic theo dng qut, song c ni suy vector
php tuyn cho mi im, v tnh cng sng ca mi im trong a gic da
vo vector php tuyn ti im .}
end;
setlength(poly,0);
For i:=0 to obj.Sodinh-1 do
setlength(DinhLinkMat[i].A,0);
Setlength(DinhLinkMat,0);
end;
Procedure
FillPolygonGourand(Poly:PolygonGourand;Vector_Chieu_Sang:Vector3D;
Anh_Sang_Nen,Anh_Sang_Chieu:real;Canvas:TCanvas;Color:RGBColor);
{T a gic Poly theo thut ton t a gic theo dng qut, song c ni suy vector
php tuyn cho mi im, v tnh cng sng ca mi im trong a gic da
vo vector php tuyn ti im .
Th tc ny tng t nh th tc t a gic theo thut ton Z-Buffer song thay v
ni suy su z ca mi im, th th tc ny s ni suy php vector ca mi
im, ri da vo php vector ca im m tnh ra cng sng m n c
c do ngun sng nh hng cung cp.}
var L,H,ND,NG,i,j,Y,MaxY,MinY:integer;
{L,H:Gioi han chi so cua mang Poly
ND: So phan tu cua mang D:DanhSachCanhCat
NG:So phan tu cua mang G:DanhsachGiaoDiem}
D:DanhSachCanhCat;
G:DanhsachGiaoDiem;
Procedure TaoDanhSachCanhCat;
Var i,d1,d2,Dem,Kc,Cuoi:integer;
begin
If (Poly[L].x<>Poly[H].x)or(Poly[L].y<>Poly[H].y) then
begin
ND:=H-L+1;
setlength(D,ND);
Cuoi:=H;
end
else
begin
ND:=H-L;
setlength(D,ND);
Cuoi:=H-1;
end;
Dem:=0;
For i:=L to Cuoi do
134
begin
If i<H then j:=i+1 else j:=L;
If Poly[i].y<=Poly[j].y then
begin d1:=i;d2:=j end
else
begin d1:=j;d2:=i end;
D[dem].y1:=Poly[d1].y;D[dem].y2:=Poly[d2].y;
D[dem].xGiao:=Poly[d1].x;
D[dem].NGiao:=Poly[d1].N;
Kc:=(Poly[d2].y-Poly[d1].y);
If Kc<>0 then
begin
D[dem].XStep:=(Poly[d2].x-Poly[d1].x)/Kc;
D[dem].NStep.x:=(Poly[d2].N.x-Poly[d1].N.x)/Kc;
D[dem].NStep.y:=(Poly[d2].N.y-Poly[d1].N.y)/Kc;
D[dem].NStep.z:=(Poly[d2].N.z-Poly[d1].N.z)/Kc;
end
else
begin
D[dem].XStep:=0;
D[dem].NStep.x:=0;
D[dem].NStep.y:=0;
D[dem].NStep.z:=0;
end;
Dem:=Dem+1;
end;
end;
Procedure TaoDanhSachGiaoDiem;
Var i,Dy:integer;
begin
Setlength(G,ND);
NG:=0;
for i:=0 to ND -1 do
begin
If (D[i].y1<=y)and(y<=D[i].y2) then
begin
Dy:=y-D[i].y1;
G[NG].x:=round(D[i].xGiao+D[i].XStep*Dy);
G[NG].y:=y;
G[NG].NGiao.x:=D[i].NGiao.x+D[i].NStep.x*Dy;
G[NG].NGiao.y:=D[i].NGiao.y+D[i].NStep.y*Dy;
G[NG].NGiao.z:=D[i].NGiao.z+D[i].NStep.z*Dy;
G[NG].ChiSoCanh:=i;
NG:=NG+1;
end;
end;
end;
Procedure SapXepVaLoc;
135
Var i,j,C1,C2:integer;
Tg:GiaoDiem;
begin
for i:=0 to NG-2 do
For j:=i+1 to NG-1 do
If G[i].x>G[j].x then
begin
Tg:=G[i];G[i]:=G[j];G[j]:=Tg;
end;
i:=0;
{Khu nhung Giao Diem thua}
While i<(NG-2) do
begin
If G[i].x=G[i+1].x then //Trung nhau
begin C1:=G[i].ChiSoCanh;C2:=G[i+1].ChiSoCanh;
If ((D[C1].y1<>D[C2].y1)and(D[C1].y2<>D[C2].y2))or
(D[C1].y1=D[C1].y2)or(D[C2].y1=D[C2].y2) then
//Xoa bo bot 1 giao diem
begin
For j:=i to NG-2 do G[j]:=G[j+1];
NG:=NG-1;
end;
end;
i:=i+1;
end;
end;
Procedure ToMauCacDoan;
Var i,x,K:integer;CuongDoSang,Dx,Dy,Dz:real;
Re,Gr,Bl,Cd:byte;
begin
If Red then Re:=1 else Re:=0;
If Green then Gr:=1 else Gr:=0;
If Blue then Bl:=1 else Bl:=0;
i:=0;
While i<NG-1 do
begin
K:=G[i+1].x - G[i].x;
If k<>0 then
begin
Dx:=(G[i+1].NGiao.x-G[i].NGiao.x)/K;
Dy:=(G[i+1].NGiao.y-G[i].NGiao.y)/K;
Dz:=(G[i+1].NGiao.z-G[i].NGiao.z)/K;
end
else
begin
Dx:=0;Dy:=0;Dz:=0;
end;
For x:=G[i].x to G[i+1].x do
136
begin
CuongDoSang:=Anh_Sang_Nen + Anh_Sang_Chieu*
Cuong_Do_Anh_Sang_Dinh_Huong(Vector_Chieu_Sang,G[i].NGiao);
{Cng sng ti mi im c tnh bng tng ca cng nh
sng nn cng vi cng c c t ngun sng nh hng, song
tnh c cng sng c c t ngun nh hng cung cp th
chng ta da vo tia ti (Vector_Chieu_Sang) v php vector ca im
G[i].Ngiao.}
Cd:=round(255*CuongDoSang);
Canvas.Pixels[x,G[i].y]:=rgb(Cd*Re,Cd*Gr,Cd*Bl);
{Ni suy php vector ca im tip theo v gn vo G[i].NGiao}
G[i].NGiao.x:=G[i].NGiao.x+dx;
G[i].NGiao.y:=G[i].NGiao.y+dy;
G[i].NGiao.z:=G[i].NGiao.z+dz;
end;
i:=i+2;
end;
end;
begin
L:=low(Poly); H:=High(Poly);
MaxY:=Poly[L].y;MinY:=MaxY;
For i:=L+1 to H do
if MaxY<Poly[i].y then
MaxY:=Poly[i].y
else
If MinY>Poly[i].y then
MinY:=Poly[i].y;
TaoDanhSachCanhCat;
For y:=MinY to MaxY do
begin
TaoDanhSachGiaoDiem;
SapXepVaLoc;
ToMauCacDoan;
end;
Setlength(D,0);
Setlength(G,0);
end;
Nng cao: Cho thp thay i cng ca cc ngun sng, cng nh thay
i hng chiu ca ngun sng nh hng.
Bi 2: Hy xy dng chng trnh vi cc chc nng nh Bi 1 song s dng
phng php t bng Gouraud.
Bi 3: Hy tng hp cc kin thc bit xy dng mt chng trnh m phng
th gii thc trong c nhiu i tng khc nhau vn ng.
138
Mc Lc
Chng I: Cc yu t c s ca ho ................................................................1
I. Cc khi nim c bn ...................................................................................................1
I.1. Thit b ho v im nh (Pixel) .................................................................................. 1
I.2. im v on thng trong mt phng............................................................................... 1
I.11. Ci t............................................................................................................................ 76
Mc Lc 139