Вы находитесь на странице: 1из 12

Written by Mnh Dng

Monday, 24 March 2008

Tc gi: Mnh Dng

Hnh hc i vi gic quan ca con ngi th kh quen thuc v d dng. Nhng hnh hc i vi my tnh th
li l mt vn khc. Nhiu bi ton ta c th gii ngay lp tc bng cch nhn vo hnh v ta thy, nhng
th hin trn my tnh th cn nhng chng trnh khng n gin cht no.
Cc gii thut hnh hc thng l cc gii thut p v i khi l rt bt ng. Thc vy, nhng tng c nhng
bi ton ta phi gii quyt vi chi ph thut ton rt ln (i khi khng th chp nhn c), nhng nh vo chnh
nhng tnh cht c bit ca hnh hc m ta li c th gii quyt n mt cch d dng v p mt.
I.

Biu din hnh hc trn my tnh.

y khng phi l mt vn kh khn. Nhng ta nn c mt cch biu din thng nht cho ring mnh, nh
vy s d dng trong vic th hin thut ton. Thng thng ngi ta c cch biu din nh sau:
im:
Point = record
x, y: Real;
end;
ng thng:
Line = Record
p1, p2: Point;
end;
a gic:
Polygon = array[1..n] of Point;
thun li th khi biu din a gic ta nn thm hai nh u v cui: nh 0 bng nh n v nh n + 1
bng nh 1.
T y ta cng thng nht vi cch khai bo ny cho cc on chng trnh c th dng n.
Ch : Ta d dng nhn thy rng cc php ton thc hin gii quyt bi ton hnh hc th hu ht l phi lm
vic vi s thc. V vy ta cng cn phi ch mt s mo nh khi khai bo d liu v bin dch. Tu vo kch
thc v yu cu v chnh xc ca kt qu bi ton ta phi c nhng chn la hp l. Bng di y l nhng
kiu s thc m Pascal c sn:
Kiu
Gii hn
Ch s c ngha
Kch thc (Byte)
Single
1.5e-45..3.4e38
7-8
4
Real
2.9e-39..1.7e38
11-12
6
Double
5.0e-324..1.7e308
15-16
8
Extended
3.4e-4932..1.1e4932
19-20
10
c bit, mc d ch khi ta dng Double hoc Extended ta mi phi khai bo bin dch {$N+}, nhng ta nn
lc no cng lm nh vy. V khi my tnh s dng b ng x l ton hc, cc php ton vi s thc s thc
hin nhanh chng km g so vi s nguyn (thm ch cn nhanh hn nu ta dng kiu s thc Double). Tt nht hy
dng th v t so snh, s thy ngay s khc bit.
Mt iu na cng cn ch l sai s trong tnh ton. Lm vic vi s thc bao gi ta cng phi chp nhn
vi nhng sai s nht nh. V vy khi so snh hai gi tr vi nhau ta ch khng c dng du =, m phi xt
tr tuyt i hiu hai gi tr vi mt gi tr Epsilon no . y, Epsilon l mt s tng i b, tu vo yu cu

ca bi ton m ta c chn la v gi tr ca n.
V d: Khng c dng: if x1 = x2 then
m phi dng
: if Abs(x1 x2) < Eps then
II. Cc phng php hnh hc.
1. im, on thng - ng thng, din tch a gic.
a. Quan h gia cc im - hm CCW.
iu gi nh ta nht khi nhc n quan h gia cc im l khong cch gia chng. Ta c th tnh khong
cch gia hai im nh sau:
function Dist(p1, p2: Point): Real;
begin
Dist := Sqrt(Sqr(p1.x p2.x) + Sqr(p1.y p2.y));
end;
Nhiu khi ta phi tr li cu hi: vic i t A, B sang C l ta r phi hay r tri?. iu ny tng chng
nh n gin v c cm gic l v ngha, nhng thc t n li rt quan trng trong mt s thut ton c th.

R phi

R tri

Ta c th dng tch c hng trong khng gian gii quyt vn ny. Ta ang lm vic trong khng gian 2
chiu (mt phng) v vy i vi chiu th 3 th mi gi tr u l Zero (nu ai hi tch c hng l g th xin tham
kho ch khc).
Hm CCW sau tr ra -1 nu l r tri, 1 nu r phi, 0 nu 3 im thng hng. Bn c c th x l c th hn
trong trng hp 3 im thng hng (im no nm gia), nhng trong nhiu ng dng th iu l khng cn
thit.
function CCW(p1, p2, p3: Point): Integer;
var
a1, b1, a2, b2, t: Real;
begin
a1 := p2.x p1.x;
b1 := p2.y p1.y;
a2 := p3.x p2.x;
b2 := p3.y p2.y;
t := a1*b2 a2*b1;
if Abs(t) < Eps then CCW := 0
else
if t > 0 then CCW := 1

else CCW := -1;


end;
b. ng thng, on thng v giao ca chng.
biu din ng thng ta c th biu din bng to hai im trn ng thng . Nhng i khi tin
li cho tnh ton, ta phi c c phng trnh di dng tng qut ca n. iu ny l d dng, bn c c th
tham kho th tc sau.
procedure Extract(p1, p2: Point; var a, b, c: Real);
begin
a := p1.y p2.y;
b := p2.x p1.x;
with p1 do c := -(a*x + b*y);
end;
Vic kim tra hai on thng c ct nhau khng l cn thit nhng cng khng phi l mt vn kh. Hai
on thng ct nhau khi hai u ca on ny th nm v hai pha ca ng thng cha on kia. Ta c th dng
chnh hm CCW c. Nhng cch lm th thin bnh thng c v cn tt hn:
function Intersect(l1, l2: Line): Boolean;
var
a1, b1, c1, a2, b2, c2, t1, t2: Real;
begin
Extract(l1.p1, l1.p2, a1, b1, c1);
Extract(l2.p1, l2.p2, a2, b2, c2);
with l1 do
t1 := (p1.x*a2+p1.y*b2+c2)*(p2.x*a2+p2.y*b2+c2);
with l2 do
t2 := (p1.x*a1+p1.y*b1+c1)*(p2.x*a1+p2.y*b1+c1);
Intersect := (t1 < Eps) and (t2 < Eps);
end;
Nu ta mun tnh c th to giao im ca hai ng thng th c l vn ch thun tu ton hc thi.
Bn c th t ci t xem sao.
c. Din tch a gic.
tnh din tch a gic ta dng cch tnh din tch ca mt hnh b gii hn bi cc ng bt k (kin thc
vi phn). Trong trng hp ny mi ng gii hn u l ng thng nn vic tnh ton cng kh d dng. Ta th
tham kho th tc sau:
function Area: Real;
var
i: Integer;
S: Real;
begin
p[n + 1] := p[1];
S := 0;
for i := 1 to n + 1 do
S := S + (p[i].x p[i 1].x)*(p[i].y + p[i 1].y);

Area := Abs(S)/2;
end;
Vic ta ly tr tuyt i ca S l c l do ca n. Nu i theo th t p[1], p[2],, p[n] l ngc chiu kim
ng h th ta s c S m, cn ngc li ta s nhn c S dng. iu ny cng kh quan trng trong mt s
trng hp c th.
Ch : mt nh ngha chnh xc hn cho khi nim thun hay ngc chiu kim ng h l nh sau: Nu ta ang
i thun chiu kim ng h th phn trong ca a gic lun bn pha tay phi ta, cn pha bn tay tri l phn
ngoi a gic. Tt nhin s l ngc chiu kim ng h trong trng hp cn li.
2. im nm trong a gic.
Bi ton: Cho mt a gic khng t ct, hy kim tra xem mt im c nm trong a gic hay khng?
T tng cho bi ton ny ni qua th rt n gin v d hiu: T im cn kim tra ta k mt tia bt k, nu
tia giao vi a gic mt s chn ln th c ngha l n nm ngoi a gic, mt s l ln th n nm trong a gic.
Nhng trn thc t c rt nhiu trng hp cn phi c gii qut trit :

Mt s trng hp gy kh khn cho thut ton


V vy, thut gii ca bi ton l nh sau: Ta i vng quanh a gic, mi khi ta i t mt bn ca tia sang mt
bn khc th ta tnh l mt ln giao vi a gic. Di y l mt cch ci t, bn c c th ci tin n hoc l tm
ra mt cch ci t khc hay hn. Ta dng li hm Intersect ni phn trc.
tin li, ta coi lun nh 1 l nh thp nht ca a gic (c to y nh nht). Hn na, vic ta chn tia l
tu thch, v vy ta s chn tia song song v cng chiu vi chiu dng ca trc Ox, nh vy s rt d dng cho
tnh ton.
function Inside(t: Point): Boolean;
var
Count, i, l: Integer;
Ray, li: Line;
begin
if t.y <= p[1].y then

begin {nu t nm di im thp nht ca a gic}


Inside := False;
Exit;
end;
Ray.p1 := t;
Ray.p2.y := t.y;
Ray.p2.x := max; {max l gi tr ln ln hn mi gi tr m ta c th
xt n}
p[0] := p[n];
p[n + 1] := p[1];
Count := 0;
l := 1; {bin l luu ch s im cui cng khng nm trn ng thng y =
t.y}
i := 1;
while i <= n + 1 do
begin
if (p[i].y = t.y) and (t.x <= a[i].x) then
begin {nu im i nm trn tia}
while p[i].y = t.y do Inc(i);
{i
tip
trn
a
gic,
tm
im
u
tin
khng
thuc
ng thng y = t.y. Ta yn tm vng lp lun dng v p[n +
1] = p[1]}
if (p[i].y - t.y)*(p[l].y - t.y) < 0 then Inc(Count);
end
else
begin
li.p1 := p[l];
li.p2 := p[i];
if Intersect(Ray, li) then Inc(Count);
end;
l := i;
Inc(i);
end;
Inside := Odd(Count);
end;
Trng hp c bit:
i vi a gic c to nh nguyn, ta c th khng phi ci t phc tp nh trn. Nu to im cn
xt cng nguyn, ta xoay tia cn xt i mt gc nh loi i trng hp tia i qua cc nh ca a gic. Cn
nu to im cn xt khng nguyn th hin nhin l khng phi lo tia cn xt i qua nh ca a gic. Lc ny
ta ch vic xt tt c cc cnh ca a gic, cnh no ct tia cn xt th ta tng bin m ln 1
Ni chung, xc nh mt im c nm trong mt a gic hay khng, ta mt mt chi ph thut ton l O(N).

Nhng y l trong trng hp tng qut, vi mt a gic bt k. Nhng trong thc t, nhiu khi ta gp nhng
trng hp c bit hn nhiu. Trong nhng trng hp ta khng th c p dng mt cch th thin thut ton
trn vo c v phi tr gi mt chi ph thut ton qu t.
Bi ton: Cho mt a gic li, hy xc nh xem mt im c nm trong a gic hay khng?
Ta hy tn dng tnh li ca a gic. V l a gic li nn n ch giao vi mt ng thng bt k ti khng
qu hai im (chnh xc th l 2 hoc l 0). Ch , giao y l khi ta i vng quanh a gic, ta i t mt bn ca
ng thng sang bn kia ca n.
n y, hn nhiu bn cng r thut ton. Thay bng vic ta i vng quanh a gic, ta ch tm hai cnh
ca a gic ct ng thng cha im cn xt. Tt nhin trng hp khng on no nh vy l tm thng. Cng
c trng hp c nhiu hn hai on nh vy nu ng thng y = t.y i qua nh ca a gic. Nhng cng chng
ng ch , ta chn mt trong hai on bt k cha nh thi. Sau khi chn c hai cnh ca a gic ri, ta xt
xem c bao nhiu cnh (trong hai cnh) ct tia cn xt. n gin, ta cng trn ng thng l ng y = t.y, v
tia c hng cng chiu vi chiu dng ca trc Ox (Vi cch trn bt k cng khng thc s phc tp hn, bn
c hy th coi n nh l mt tr gii tr?)

Ch rng chi ph ch yu cho thut ton ny li l php tm kim. V vy, nu ta p dng php tm kim tun
t vo y th ng l v ngha. Bng cch chia a gic lm hai na, phn cc nhau bi hai im thp nht v
cao nht (hai nh t m trn hnh v). Ta ch phi tm kim nh phn (xin c phn cu trc d liu v gii
thut) trn hai na ny thi, mi na s tm ra mt cnh tho mn. Ta tm im i c to ln nht nhng nh hn
t.y, cnh (p[i], p[i + 1]) s l cnh cn tm. Nh vy, chi ph thut ton cho bi ton ny t l vi LogN. n y,
mi vic gn nh c gii quyt, cc cng vic cn li l bi tp thc hnh ca bn c.
Thut ton chng c ngha g khi cu hi mt im c nm trong a gic hay khng? ch c dng c
mt ln. Nhng trong trng hp phi tr li nhiu ln cu hi nh vy th thut ton thc s pht huy tc dng.
3. Bao li.
Bao li ca mt tp hp im c nh ngha l mt a gic li nh nht cha ton b tp im ny. Mt
cch tng ng, bao li l mt ng ngn nht bao quanh tp im. Bao li c mt s tnh cht d dng nhn ra
l: cc nh ca n phi thuc tp im cho; vi mt ng thng bt k nm ngoi bao khi ri v pha bao th
s chm mt trong cc nh ca bao.
Bi ton: Cho tp im, tm bao li ca n?
Chng ta tm b qua mt s v d cc oan nh: tt c tp im u nm trn mt ng thng?!!!...

a. Thut ton bc gi.


y l mt gii thut rt con ngi. Bt u bng vic chn mt im chc chn thuc bao, dng mt tia
qut ngc chiu kim ng h cho n khi gp mt im khc, ta c thm mt nh thuc bao, li tip tc vi
im va tm cQu trnh kt thc khi gp li nh u tin.
Cc bc ca thut ton
C nhiu cch chn im u tin, mt trong cch l ta chn im c honh nh nht trong cc im c
tung nh nht.
Mt iu ng ch y l vic qut mt tia ngc theo chiu kim ng h tm im u tin chm phi
thc cht l ta tm im m tia ni t im gc ti n to vi trc honh mt gc b nht (iu ny kh d hiu
thi). V vy chng ta cng cn phi bit cch tnh gc khi cho im gc v im cn xt . Nhng ch vi vic
sp xp (tm gc nh nht) thi m phi lm phc tp n vy th tht l ung cng. Ta c th a ra mt th t
hon ton ging vi vic tnh gc c th m chng trnh th n gin hn nhiu:
function Angle(p1, p: Point): Real;
var
dx, dy, ax, ay, t: Real;
begin {p l im gc}
dx := p1.x p.x;
dy := p1.y p.y;
ax := Abs(dx);
ay := Abs(dy);
if ax + ay < Eps then t := 0
else t := dy/(ax + ay);
if dx < 0 then t := 2 t
else
if dy < 0 then t := 4 + t;
Angle := t;
end;
Sau y l th tc tm bao li theo thut ton bc gi.
procedure Wrap;
var
i, li: Integer;
min, tmp: Real;
t: Point;
begin
t := p[1];
li := 1;
for i := 2 to n do
if (p[i].y < t.y)or(p[i].y = t.y)and(p[i].x < t.x) then
begin
t := p[i];
li := i;

end;
p[n + 1] := t; { pht hin thi im kt thc}
m := 0; {m s l s im trn bao}
repeat
Inc(m);
p[li] := p[m];
p[m] := t;
min := max;
for i := m + 1 to n + 1 do
begin
tmp := Angle(p[i], p[m]);
if (tmp < min) or ((tmp = min) and
(Abs(t.xp[m].x) < Abs(p[i].xp[m].x))) then
begin {nu nhiu im tho mn, chn im xa nht}
min := tmp;
li := i;
t := p[i];
end;
end;
until li = n + 1;
end;
b. Thut ton Graham.
Thut ton bc gi i hi mt chi ph l O(M*N) (trong M l s im trn bao). V vy n ch lm vic
tt trong trng hp s im nm trn bao nh hn nhiu so vi tng s. Nhng trong trng hp xu nht (tt c
mi im u nm trn bao) th chi ph thut ton s ln ti O(N 2) - rt ti t! Chng ta s tip cn mt phng
php tt hn phng php qut Graham. Phng php ny c chi ph thut ton n nh v khng tn km lm.
Hu nh tt c chi ph l dnh cho vic khi mt to ng khp kn n t tp im cho.
Chn im cht c honh x ln nht trong cc im c tung y nh nht (khi hiu r thut ton cc bn
s bit c nguyn nhn). Chuyn im cht v v tr 1 tin cho tnh ton. Ta sp xp cc im theo kho l gc
to bi im v im cht vi trc honh theo th t tng dn. Khi i theo th t p[1], p[2], p[N], p[1] ta thu
c mt a gic khp kn n.
Ta i vng qua a gic ny, th t mt im vo bao v kim tra xem cc im trc c cn nm trn bao
hay khng. Nu khng ta ch vic loi im ra khi bao thi.
Vic kim ra mt im c cn nm trn bao hay khng c th lm nh sau: khi cho mt im mi vo bao, ta
s ln ngc li nhng im nm trong bao. Trong qu trnh, nu gp mt im l khc r phi th im ny s
khng thuc bao na, ta loi n lun. Qu trnh kt thc khi ta gp mt im l khc r tri, v tt c cc im t
li v 1 chc chn s thuc bao.

Cc bc ca thut ton.
Ci t khng phi l mt vn kh nhng phi cnh gic vi sai s v cc im thng hng.
Vic xy dng ng khp kn n khng thc s phi dng hm Angle v d gy sai s v chi ph hi ln. V
tt c cc tia to bi im cht v mt im bt k u trong gc phn t I v II nn ta c th dng hm Lower sau
lm php so snh cho vic sp xp.
function Lower(p1, p2: Point): Boolean;
var
a1, b1, a2, b2: Real;
begin
a1 := p1.x p[1].x;
b1 := p1.y p[1].y;
a2 := p2.x p[1].x;
b2 := p2.y p[1].y;
Lower := a1*b2 > a2*b1;
end;
Thc cht ta so snh hai gi tr a1/b1 v a2/b2, tc l cotg ca hai gc. Nhng ta khng lm nh vy v
phi xt b1, b2 liu c bng 0 hay khng.
Sau y l on chng trnh miu t phng php qut Graham. Ta coi mi cng vic khi to xong xui.
Hm CCW ni ti phn trc.
procedure GrahamScan;
var
i: Integer;
begin
m := 2;
for i := 3 to n do
begin
while CCW(p[m - 1], p[m], p[i]) <> 1 do Dec(m);
Inc(m);
p[m] := p[i];
end;
end;
Chi ph cho th tc trn t l thun vi N. ng vy, mc d trong vng lp c mt vng lp, nhng ta l
khng im no b loi qu mt ln nn vng lp ny ch hot ng khng n N ln.

Nh vy chi ph cho thut ton ny l O(NlogN) nu ta dng phng php sp xp tt (nh Quick Sort chng
hn).
c. Ci tin.
Ta c th lm gim chi ph tnh ton i rt nhiu bng cch loi b nhng im chc chn khng thuc bao.
V d nh ta loi i nhng im nm hon ton trong t gic c cc nh l cc im c honh ln nht,
honh nh nht, tung ln nht, tung nh nht. i vi nhng b d liu c to mt cch ngu nhin th
vic ny rt c ch. Nhng nu tt c cc im u thuc bao th vic ny l v ngha. Ni chung mi cch tham
lam th cng u tt trong mt s trng hp nht nh m thi.
4. Cp im gn nht.
Bi ton: Cho tp im, hy tm cp im c khong cch nh nht trong tp im trn.
Mt cch th thin ta c th xt tt c cc cp im v lu li cp im c khong cch nh nht. Nhng nh
vy th chi ph thut ton s l O(N2). Ta hon ton c th gii qut bi ton ny vi chi ph l O(NlogN) vi vic p
dng t tng chia tr ca thut ton Merge Sort (xin c phn cu trc d liu v gii thut). tng thut
ton nh sau: ta sp xp cc im theo honh (hoc tung cng c). Ti mi bc ta chia tp lm hai phn
th cp im gn nht s nm mt trong hai phn hoc l cp im m mi im thuc mt phn.

Chia tr
Vn l phi x l trng hp mi im nm mt phn, cn trng hp c hai im u thuc mt phn
th c gii quyt v li gi qui. Ta c th s dng ngay th t sp xp v khong cch min tm c
c lm cn cho trng hp xt trn hai phn. Khi xt mi im na ny, nu gp im na kia c hiu
honh n n khng nh hn khong cch min tm c th ta dng lun v tp im c sp theo x.
Nhng nh vy vn c th gp phi trng hp xu: cc im nm st hai bn ng phn cch; trong trng
hp , nu x l khng tt th chi ph c th s l O(N2).

trng hp xu
Ta gii quyt vn ny bng cch sp cc im theo tung y v xt tng t nh trn. Ch , nu ti mi
bc ta li gi th tc sp xp mi na th chi ph thut ton s l O(Nlog 2N), khng phi l thc s tt lm. Nhng
mt cht, ta thy mi na u c sp xp, hn na cch lm ca ta cng ang da vo t tng ca Merge

Sort, nh vy ti sao ta khng sp xp theo kiu Merge Sort ngay trong th tc quy ca mnh. Nh vy hai cng
vic u c s l ng thi. Chi ph cho bi ton ny ging nh chi ph sp xp bng Merge Sort, t l vi
NlogN.
Ci t thut ton ny khng kh nhng kh t m. Ta b qua bc sp xp tp im theo honh x. u tin
l th tc trn hai phn, tip theo l th tc quy tm cp im gn nht.
procedure Merge(l, r: Integer);
var
t: Polygon;
i, j, m, c: Integer;
begin
m := (l + r) div 2;
i := l;
j := m + 1;
for c := 1 to r l + 1 do
if (j > r) or (p[i].y < p[j].y) then
begin
t[c] := p[i];
Inc(i);
end
else
begin
t[c] := p[j];
Inc(j);
end;
for c := 1 to r l + 1 do p[l + c - 1] := t[c];
end;
procedure MinDist(l, r: Integer);
var
i, j, j1, m: Integer;
begin
if l = r then Exit;
m := (l + r) div 2;
MinDist(l, m);
MinDist(m + 1, r); {gi quy tm min trn hai phn}
j1 := m + 1;
for i := l to m do
begin
while (j1 <= r)and(p[j1].y p[i].y >= min) do Inc(j1);
for j := j1 to m do
if p[j].y p[i].y >= min then Break
else
if Dist(p[i], p[j]) < min then

begin {cp nht kt qu}


min := Dist(p[i], p[j]);
Result.x := p[i];
Result.y := p[j];
end;
end;
Merge(l, r); {trn hai phn}
end;
Result l bin lu kt qu, c cu trc ging nh kiu Line. Bin min dng lu khong cch nh nht tm
c cho n thi im hin ti

Вам также может понравиться