You are on page 1of 10

thut ton v ng thng

thut ton v ng thng


Bi:
lm th ngc chu

Thut ton v on thng


Xt on thng c h s gc 0<m<=1 v deltax>0. Vi cc on thng dng ny, nu
(xi, yi) l im c xc nh bc th i th im k tip (xi+1, yi+1) bc th i+1
s l mt trong hai im sau (xem hnh v 1.4) :

Hnh 1.4 : Cc im v gn vi im mun v.


Vn t ra l chn im v nh th no ng thng c v gn vi ng thng
mun v nht v t c ti u ha v mt tc ?

1/10

thut ton v ng thng

Thut ton DDA (Digital DifferentialAnalyzer)


L thut ton tnh ton cc im v dc theo ng thng da vo h s gc ca phng
trnh ng thng y=mx+b.
Trong

Nhn thy trong hnh v 1.4 th ta ca im x s tng 1 n v trn mi im v, cn


vic quyt nh chn yi +1 l yi +1 hay yi s ph thuc vo gi tr sau khi lm trn ca
tung y. Tuy nhin, nu tnh trc tip gi tr thc ca y mi bc t phng trnh
y=mx+b th cn mt php ton nhn v mt php ton cng s thc.
yi +1 = mxi +1 + b = m(xi + 1) + b = mxi + b + m
ci thin tc , ngi ta kh php nhn trn s thc.
Ta c : yi = mxi + b
yi +1 = yi + m int(yi +1)
Tm li khi 0<m<=1 :
xi +1 = xi + 1
yi +1 = yi + m int(yi +1)
Trng hp m>1: chn bc tng trn trc y mt n v.
xi +1 = xi + 1/m int(xi +1)
yi +1 = yi + 1
Hai trng hp ny dng v mt im bt u t bn tri n im cui cng bn
phi ca ng thng (xem hnh 1.5). Nu im bt u t bn phi n im cui cng
bn tri th xt ngc li :
0<m<=1: xi +1 := xi - 1
yi +1:= yi - m -> int(yi+1)

2/10

thut ton v ng thng

m>1: xi +1:= xi 1/m -> int(xi+1)


yi +1:= yi 1

Hnh 1.5 : Hai dng ng thng c 0<m<1 v m>1.


Tng t, c th tnh ton cc im v cho trng hp m<0: khi |m|<=1 hoc |m|>1
(sinh vin t tm hiu thm).
Lu thut ton DDA

3/10

thut ton v ng thng

Ci t minh ha thut ton DDA


Procedure DDA ( x1, y1, x2, y2, color : integer );
4/10

thut ton v ng thng

Var dx, dy, step : integer;


X_inc, y_inc , x, y : real ;
Begin
dx:=x2-x1;
dy:=y2-y1;
if abs(dx)>abs(dy) then steps:=abs(dx)
else steps:=abs(dy);
x_inc:=dx/steps;
y_inc:=dy/steps;
x:=x1; y:=y1;
putpixel(round(x),round(y), color);
for k:=1 to steps do
begin
x:=x+x_inc;
y:=y+y_inc;
putpixel(round(x),round(y), color);
end;
end;
Thut ton Bresenham

5/10

thut ton v ng thng

Hnh 1.6 : Dng ng thng c 0<=m<=1.


Gi (xi +1,yi +1) l im thuc on thng (xem hnh 1.6). Ta c y:= m(xi +1)+b.
t d1 = yi +1 - yi
d2 = (yi +1) - yi +1
Vic chn im (xi +1, yi +1) l P1 hay P2 ph thuc vo vic so snh d1 v d2 hay du
ca d1-d2.
- Nu d1-d2<0 : chn im P1, tc l yi +1= yi
- Nu d1-d2 0 : chn im P2, tc l yi +1= yi +1
Xt Pi = deltax (d1 - d2)
Ta c : d1 - d2 = 2 yi+1 - 2yi - 1
= 2m(xi+1) + 2b - 2yi - 1
Pi = deltax (d1 - d2) = deltax[2m(xi+1) + 2b - 2yi - 1]

= 2deltay(xi+1) - 2deltax.yi + deltax(2b - 1)


= 2deltay.xi - 2deltax.yi + 2deltay + deltax(2b - 1)

6/10

thut ton v ng thng

Vy C = 2deltay + deltax(2b - 1) = Const


Pi = 2deltay.xi - 2deltax.yi + C
Nhn xt rng nu ti bc th i ta xc nh c du ca Pi th xem nh ta xc nh
c im cn chn bc (i+1). Ta c :
Pi +1 - Pi = (2deltay.xi+1 - 2deltax.yi+1 + C) - (2deltay.xi - 2deltax.yi + C )
Pi +1 = Pi + 2deltay - 2deltax ( yi+1 - .yi )
- Nu Pi < 0 : chn im P1, tc l yi +1= yi v Pi +1 = Pi + 2deltay.
- Nu Pi 0 : chn im P2, tc l yi +1= yi +1 v Pi +1 = Pi + 2deltay - 2deltax
- Gi tr P0 c tnh t im v u tin (x0 ,y0 ) theo cng thc :
P0 = 2deltay.x0 - 2deltax.y0 + C
Do (x0 ,y0 ) l im nguyn thuc v on thng nn ta c :

Th vo phng trnh trn ta c :


P0 = 2deltay - deltax
Lu thut ton Bresenham

7/10

thut ton v ng thng

8/10

thut ton v ng thng

Ci t minh ha thut ton Bresenham


Procedure Bres_Line (x1,y1,x2,y2 : integer);
Var dx, dy, x, y, P, const1, const2 : integer;
Begin
dx : = x2 - x1; dy : = y2 - y1;
P : = 2*dy - dx;
Const1 : = 2*dy ; const2 : = 2*(dy - dx) ;
x:= x1; y:=y1;
Putpixel ( x, y, Color);
while (x < x-2 ) do
begin
x : = x +1 ;
if (P < 0) then P : = P + const1
else
begin
y : = y+1 ;
P : = P + const2
end ;
putpixel (x, y, color) ;
end ;
End ;

9/10

thut ton v ng thng

Nhn xt :
Thut ton Bresenham ch thao tc trn s nguyn v ch tnh ton trn php cng v
php nhn 2 (php dch bit). iu ny l mt ci tin lm tng tc ng k so vi
thut ton DDA.
tng chnh ca thut ton ny l ch xt du Pi quyt nh im k tip, v s
dng cng thc truy hi Pi +1 - Pi tnh Pi bng cc php ton n gin trn s nguyn.
Tuy nhin, vic xy dng trng hp tng qut cho thut ton Bresenham c phc tp
hn thut ton DDA.

10/10

You might also like