Professional Documents
Culture Documents
(*)
(**)
PHN I.
KHI NIM HNH HC V CC I TNG HNH HC C BN
1. Khi nim hnh hc.
a s cc thut ton u tp trung vo vn bn v cc con s, chng c thit k v
x l sn trong phn ln cc mi trng lp trnh. i vi cc bi ton hnh hc th
tnh hung khc hn, ngay c cc php ton s cp trn im v on thng cng c
th l mt thch thc v tnh ton.
Cc bi ton hnh hc th d hnh dung mt cch trc quan nhng chnh iu li c
th l mt tr ngi. Nhiu bi ton c th gii quyt ngay lp tc bng cch nhn vo
mt mnh giy nhng li i hi nhng chng trnh khng n gin.
V d: Bi ton kim tra mt im c nm trong a gic hay khng?
2. i tng hnh hc c bn.
Trong cc bi ton tin hc thuc loi hnh hc c 3 i tng c bn l: im, on
thng v a gic.
- im: c xc nh l cp (x,y) trong h to cc.
- on thng: L cp im c ni vi nhau bng mt phn ca ng thng.
- a gic: L dy cc im m 2 im lin tip ni vi nhau bi on thng v im
u ni vi im cui to thnh ng gp khc khp kn.
3. Mt s kin thc cn nh
r
r
3.1 Gi s c cc im A(x1,y1); B(x2, y2); C(x3,y3); u ( x1 , y1 ) ; v ( x2 , y2 ) . Ta c:
uuu
r
AB =(x2-x1,y2-y1)
AB =
( x2 x1 ) 2 (y 2 - y1 ) 2
rr
u.v
rr
r r
r r
r r
u.v
x1 x2 y1 y2
= u . v cos(u, v) = x1 x2 y1 y2 cos(u, v) r r
u.v
( x12 y12 )( x2 2 y2 2 )
3
r r
r r
r r
r r
r r uxv
x1 y2 x2 y1
sin(u, v) r r
u.v
( x12 y12 )( x2 2 y2 2 )
uuur uuur
S=
2
2
1
S=
2
(x
i 1
i 1
xi 1 ) yi
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
Single
Real
Double
Extended
Gii hn
1.5e-45..3.4e38
2.9e-39..1.7e38
5.0e-324..1.7e308
3.4e-4932..1.1e4932
Ch s c ngha
7-8
11-12
15-16
19-20
Chng trnh:
Chng trnh
var a, b, c, x1, y1, x2, y2, x0, y0 : real;
function max(a,b : real): real;
begin
if a>b then max:= a else max := b;
end ;
function min(a,b: real):real;
begin
if a<b then min := a else min := b;
end;
procedure nhap;
Begin
write('nhap toa
do diem
write('nhap toa
M(x0,y0):');
do diem
readln(x0,y0);
a:=y2-y1;
b:=x1-x2;
c:= x2*y1 - x1*y2;
end;
Function f(x,y : real) : real;
Begin
f:=a*x+b*y+c
End;
Function thuoc(x0,y0 : real) : boolean;
var ok, ok1, ok2 : boolean;
begin
ok
:= f(x0,y0)=0;
Bi ton 3:
im M(X0, Y0) C thuc tia AB hay khng? D liu vo nhp t bn phm, kt
qu hin trn mn hnh.
Hng dn
im M(X0, Y0) thuc tia AB nu M thuc ng thng AB v AM=kAB vi
k 0. Do to ca M phi tho mn cc iu kin:
F(x0, y0) = 0, (X0 X1)(X2 X1) 0 v (Y0 Y1)(Y2 Y1) 0.
Chng trnh
var a, b, c, x1, y1, x2, y2, x0, y0 : real;
7
procedure nhap;
Begin
write('nhap toa
do diem
write('nhap toa
M(x0,y0):');
do diem
readln(x0,y0);
a:=y2-y1;
b:=x1-x2;
c:= x2*y1 - x1*y2;
end;
Function f(x,y : real) : real;
Begin
f:=a*x+b*y+c
End;
Function thuoc(x0,y0 : real) : boolean;
var ok, ok1, ok2 : boolean;
begin
ok
:= f(x0,y0)=0;
okl := (x0-x1)*(x2-x1)>=0;
ok2 := (y0-y1)*(y2-y1)>=0;
thuoc:=ok and (ok1 and ok2);
end;
BEGIN
nhap ;
if thuoc(x0,y0) then write('M thuoc tia AB')
else write('M khong thuoc tia AB');
readln
END.
if gd=1 then
write('cat nhau tai diem (',X:10:2,',',y:10:2, ') ')
else
if gd=0 then
write('hai duong thang trung nhau')
else
write('hai duong thang song song voi nhau');
end;
BEGIN
clrscr; nhap ; ketluan; readln
END.
Hng dn
a) Cch 1
Tm giao im M ca 2 ng thng AB v CD, sau kim tra xem M c
thuc ng thi c hai on thng AB v CD hay khng.
b) Cch 2
on thng AB ct on thng CD trong cc trng hp sau:
- A hoc B thuc on thng CD.
- C hoc D thuc on thng AB.
- on thng AB v on thng CD giao nhau ti im M khc u mt ca
hai on thng ny khi: A, B khc pha nhau so vi ng thng CD, ng thi C,
D khc pha nhau so vi ng thng AB. Gi phng trnh ng thng AB l
F(x, y) = 0, phng trnh ng thng CD l G(x, y) = 0 th iu kin on
thng AB v on thng CD giao nhau l :
F(X3, Y3)F(X4, Y4) < 0 v G(X1, Y1)G(X2, Y2) < 0.
Chng trnh:
Bi ton 6. Cho tia AM cha im B (khc A) v on thng CD bit
to cc im l A(X1,Y1) , B(X2, Y2), C(X3,Y3) , D(X4, Y4). Tm giao
im (nu c) ca tia AM vi on thng CD.
Hng dn
Bc 1. Tm giao im N ca 2 ng thng AB v CD
10
Chng trnh:
Chng trnh
uses crt;
type diem = record x,y : real; end;
ml
var d
= array[1..4] of diem;
: ml;
al,bl,cl,a2,b2,c2. : real;
m : diem;
procedure nhap;
var i : byte;
begin
for i:=1 to 4 do
begin
write('nhap toa do x,y cua diem thu
readln(d[i].x,d[i].y);
end;
al := d[2].y-d[1].y;
bl := d[1].x-d[2].x;
cl :=d[l].y*d[2].x-d[l].x*d[2].y;
a2 := d[4].y-d[3].y;
b2 := d[3].x-d[4].X;
c2 := d[3].y*d[4].x-d[3].x*d[4].y;
end;
function f(x,y:real): real;
begin
f := al*x + bl*y + cl;
end;
function g(x,y : real) : real;
begin
g := a2*x + b2*y + c2;
end;
function khacphiaAB(c,d: diem) : boolean;
begin
11
khacphiaAB := f(c.X,c.y)*f(d.X,d.y)<0;
end;
function max(a,b : real): real;
begin
if a>b then max:= a else max := b;
end ;
function min(a,b: real):real;
begin
if a<b then min := a else min := b;
end;
function khacphiaCD(a,m: diem) : boolean;
begin
khacphiaCD := g(a .x,a.y)*g(m.x,m.y)<0;
end;
procedure tim_M(var m: diem) ; {Tm im M trn tia AM m M kh xa A}
var k : integer; xmax,ymax : real;
begin
k := 1;
xmax:=max(abs(d[3].x),abs(d[4].x));
ymax:=max(abs(d[3].y),abs(d[4].y));
while (abs(d[l].x+ k*(d[2].x-d[l].x)) <=xmax)
and (abs(d[l].y+ k*(d[2].y-d[1].y))<=ymax)do
inc(k);
m.x := d[l].x +k* (d[2].x-d[l].x);
m.y := d[l].y +k* (d[2].y-d[1].y);
end;
function thuoctia(d3 : diem) : boolean;
var ok,okl,ok2 : boolean;
begin
ok := f(d3.x,d3.y)=0;
okl := (d3.x-d[1].x)*(d[2].x-d[1].x)>=0;
ok2 :=(d3.y-d[1] .y)*(d[2].y-d[1].y)>= 0;
thuoctia := ok and (okl and ok2);
end ;
BEGIN
clrscr;
nhap ;
tim_M(m);
12
if(g(d[1].x(d[1].y)=0)and
(min(d[3].x,d[4].x)<=d[l].x) and
(d[1].x<=max,(d [3].X,d[4].x)) and
(min(d[3].y,d[4].y)<=d[1].y) and
(d[l].y<=max(d[3].y,d[4].y))
or thuoctia(d[3]) or thuoctia(d[4])
or (khacphiaAB(d[3],d[4]))and(khacphiaCD(d[1],m))
then write('Tia AB cat doan CD')
else write('Tia AB khong cat doan CD');
readln
END.
Chng trnh:
14
Hng dn
Bc 1: Tnh D=a1b2 - a2b1, Dx = c2b1-c1b2, Dy = a2c1-a1c2
Bc 2: Xt 3 kh nng:
+ Nu D = Dx = Dy = 0 th kt lun 2 ng thng trng nhau
+ Nu D = 0 v ((Dx 0) hoc (Dy 0)) th kt lun 2 ng thng song song
+ Nu D 0 th kt lun 2 ng thng ct nhau ti im c (Dx/D, Dy/D)
Chng trnh:
15
3. V tr ca im so vi a gic
Bi ton 7. Cho a gic gm N nh d1, d2,....dN v im M. Xc nh v tr tng
i ca M vi min trong a gic.
Phng php:
Bc 1. Kim tra M c thuc cnh no ca a gic hay khng, nu c th kt lun M
thuc min trong a gic v kt thc
16
Bc 2. Ngc li: K on thng MN song song trc honh sao cho honh ca N
ln hn max ca cc honh nh a gic. Xt giao cc cnh ca a gic vi on
thng MN. Nu s giao im l l th M trong a gic, l chn th M ngoi a gic.
Xt cnh (d[i], d[i+l]), nhng trng hp sau y c coi nh tng thm 1 giao
im:
+ nh d[i] khng thuc on thng MN, nh d[i+1] nm trn on thng MN, 2
nh d[i] v d[i+2] khc pha so vi ng thng MN.
+ nh d[i-1], d[i+2] ngoi on thng MN, hai nh d[i] v d[i+1] thuc on MN,
d[i-1] v d[i+1] khc pha so vi ng thng MN
+ nh d[i] v d[i+1] khng thuc MN v cnh (d[i],d[i+1]) ct on thng MN
d[i]
M
d[i-1]
d[i+1]
d[i]
d[i+2]
d[i+1] N
d[i]
M
d[i+2]
d[i+1]
Chng trnh:
Cho a gic khng t ct A1A2...AN vi cc nh Ai(xi,yi) nguyn. Vi im M(xM,yM)
cho trc, hy xc nh xem M c nm trong a gic cho hay khng (Trong
trng hp trn cnh a gic xem nh nm trong a gic)
D liu: Cho trong tp Dagiac.inp
+ Dng u l s N
+ N dng tip theo mi dng ghi xi,yi l to Ai
+ Dng n+2 ghi 2 s xM v yM
D liu l cc s nguyn.
Kt qu: a ra mn hnh thng bo im A c nm trong a gic hay khng
Bi ton 8:
Kim tra mt a gic N nh c l a gic li hay khng. D liu vo t file vn bn
'dgjoi.inp' dng du l s N, N dng tip theo mi dng l hai s honh d v tung
ca cc nh ln lt t 1 dn N. Kt qu hin trn mn hnh: dng ch "da giac loi"
hoc "da giac khong loi" (a gic li hoc a gic khng li).
17
Hng dn
a gic l li nu vi mi cnh ni nh i (1 < i < N) vi nh i + 1 (nh N + 1 coi
nh nh 1) th mi nh j (1 < j < N) v nh i + 2 phi lun lun cng pha so vi
ng thng cha cnh (i, i + 1).
Chng trnh
uses crt ;
const max = 20;
fi = dg_loi.inp;
type toao = array[1..max] of real;
var x,y
: toado;
n : word;
procedure input;
var i : word;
f : text;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do readln(f,x[i],y[i]);
close(f) ;
end;
function cungfia(x1,x2,x3,x4,y1,y2,y3,y4:rea1):boo1ean;
var d1,d2: rea1;
begin
d1:=(y3-y1)*(x2-x1)-(x3-x1)*(y2-y1);
d2:=(y4-y1)*(x2-x1)-(x4-x1)*(y2-y1);
cungfia:=d1*d2>=0;
end;
function dg_loi: boolean;
var i,j,k,1 : word;
begin
for i:=1 to n do
begin
k : = i + 2 ;
1 : = i + 1 ;
if k=n+l then k:= 1;
if l=n+l then 1:= 1;
for j:=1 to n do
18
if (j<>i) and
(not cungfia( x [i],X [l], X [j],x[k],y[i],y[l],y[j],y[k]))then
begin
dg_loi:=- false;
exit;
end ;
end ;
dg_loi := true;
end ;
BEGIN
clrscr;
input;
if dg_loi then writelni'da giac loi ')
else writeln('da giac khong loi ');
END.
19
- Xc nh s im c to nguyn: S=round(abs(a/2)+b/2+1)
Chng trnh:
Trang 20
uuur uuur
( xB x A )( yC y A ) ( xC x A )( y B y A )
AB x AC
2
2
1
S=
2
(x
i 1
i 1
xi1 ) yi
Trang 21
Trang 22
Trang 23
Trang 24
Trang 26
Trang 27
V d 2. Ph S
Trn mt phng ta , mt hnh ch nht vi cc cnh song song vi cc trc to
c xc nh bi hai im i tm: nh gc trn bn tri v nh gc di bn phi.
Cho N hnh ch nht song song vi cc trc to . Ph S ca cc hnh ch nht c din
tch nh nht cha N hnh ch nht cho.
D liu vo: c t tp PHUCN.INP c cu trc:
- Dng u tin cha N (N 30);
- Trong N dng tip theo, mi dng ghi 4 s l to ca hai nh i tm ca mt hnh
ch nht, cc s ny l cc s nguyn c tr tuyt i khng qu 100.
Kt qu: Ghi ra tp vn bn PHUCN.OUT
- Dng 1 ghi to hai nh i tm ca ph S cc
hnh ch nht
- Dng 2 ghi din tch ca phn hnh S khng nm
trong hnh ch nht no trong N hnh cho
- tng:
- Xc nh hnh ch nht H nh nht bao tt c cc hnh ch nht ban u:
Gi minx,maxx ln lt l honh nh nht v ln nht trong cc honh cc nh
hnh ch nht cho; miny, maxy ln lt l tung nh nht v ln nht trong cc
tung cc nh hnh ch nht cho. Khi hnh H c to nh di tri l
(minx,miny) v nh trn phi l (max,maxy). l ph S cn tm.
- Tnh din tch hnh H l (maxx-minx)(maxy-miny)
- Tnh din tch s ph bi cc hnh ch nht ( nu r phng php chung)
- Phn din tch cn tm l: s1:=abs((maxx-minx)*(maxy-miny))-s
- Chng trnh:
Trang 28
Trang 29
Trang 30
Trang 31
V d 1. a gic khng t ct
Cho N im A1, A2, ..., AN trn mt phng. Cc im u c to nguyn v khng c
3 im bt k trong chng thng hng. Hy vit chng trnh thc hin cc cng vic
sau y: Xc nh mt a gic khng t ct c nh l mt s im trong cc im
cho v cha tt c cc im cn li v c chu vi nh nht. Hy tnh din tch a gic
ny.
D liu: cho trong tp HCN.INP gm n+1 dng
+ Dng 1: Cha s N
+ Dng i+1 (1 i N): Ghi 2 ch s nguyn xi,yi l to nh
Ai.
Cc s trn cng mt dng cch nhau mt khong trng.
Kt qu: Xut ra tp HCN.Out
+ Dng 1: Ghi 3 s K, V, S vi K l s nh a gic tm c, V l chu vi, S l din tch
ca n.
+ Dng i+1(1 i K): Ghi to ca nh a gic.
- tng:
- Tm im c tung nh nht. im s l nh a gic
- Gi s ta chn c im P M. Tm im Pi sao cho gc hp bi PMPi v trc honh
l nh nht v ng thi gc ny phi ln hn gc hp bi P MPM-1 v trc honh. im
Pi s l mt nh ca a gic.
Trang 32
Trang 33
Trang 34
Trang 35
Trang 36
Trang 37
Trang 38
Trang 39
Trang 40
Bi ton 1. Cho 4
xem bn im
vung c cc cnh
nhau.
Nhn xt 1b. Nu xA= xB, xC = xD, yA = yD v yB = yC th ABCD
l hnh ch nht (c cc cnh song song vi trc to )
Bc 1. Bn sp xp to 4 im theo th t tng dn theo honh (trong hnh, th
t cc im sau khi sp xp l A, B, D, C). Sau chng ta kim tra nhn xt 1b. Nu
ng chng ta qua bc 2, nu sai ta ghi kt qu SAI.
Bc 2. Tnh di AB, BD, CD, DA. Nu AB = BC = CD = DA th ta ghi DUNG,
nu sai ta ghi SAI.
Nh vy chng ta gii quyt xong bi ton 1. Tuy nhin, nu cc cnh hnh vung
khng song song vi trc to th bi ton 1 s tr thnh bi ton nh
sau:
Trang 41
Nu gii theo cch thng thng, ta khng nhng kim tra di 4 cnh m phi
kim tra n c ln 4 gc. Ti ngh ra mt gii thut n gin hn nh sau :
Chng ta cng sp xp 4 im ban u theo th t tng dn theo honh , ta c 4
im sp xp theo th t l A, B, D, C. Sau , chng ta s to ra 4 im mi l
A, B, C, D sao cho xA = xB=min (cc honh ca A, B, C, D) ; xC = xD
= max (cc honh ca A, B, C, D); yA = yD = min
(cc tung ca A, B, C, D); yB = yC = max (cc tung ca A, B, C, D).
By gi chng ta kim tra gi tr k = (AB = BC = CD = DA) and (AB = BC =
CD = DA). Nu k = True th ABCD l hnh vung, ngc li th ABCD khng phi l
hnh vung.
Sau y l chng trnh ca bi 2.
Program KiemTraHinhVuong;
Const fi = 'KTHV.INP';
fo = 'KTHV.OUT';
Type Point = Record x,y:real;
End;
Var P : Array[1..8] of Point; {Cc im
A,B,D,C,A,B,C,D}
A : Array[1..8] of Real; {AB,BC,CD,DA,AB,BC,CD,DA}
i,j : byte; f:text;
FunctionD(A,B:Point):real;
Begin
D:=sqrt(sqr(A.x-B.x)+sqr(A.y-B.y));
End;
Trang 42
Trang 44
V d : (Theo hnh )
Trang 47
For j:=1 to N do
Begin
max:=i; If max
For d:=1 to N-max do
If KT(i,j,d) then Inc(HV[d]); End;
Km theo , chng ta phi c hm KT(i,j,d) tr v gi tr Boolean
kim tra xem nt (i,j) c th l nh trn tri ca hnh vung m
cnh c di d on hay khng. Nh vy, chng trnh hon chnh
ca bi 5 l :
ProgramSquare;
Const fi = 'SQUARE.INP'; fo = 'SQUARE.OUT'; Vari,j,d,max,N,M,P:byte;
HV : Array[1..9] of integer;
C : Array[1..9,1..9,1..2] of boolean;
f:text; ProcedureReadInp; Var a,b:byte; ch:char; Begin
Fillchar(C,sizeof(C),false); Fillchar(HV,sizeof(HV),0); P:=0;
Assign(f,fi); Reset(f); Readln(f,N); Readln(f,M);
For i:=1 to M do
Begin
Readln(f,ch,a,b);
If ch='H' then C[a,b,1]:=True; If ch='V' then C[b,a,2]:=True; End;
Close(f); End; FunctionKT(i,j,d:byte):boolean; Label Ra;
Var a:byte; k:boolean; Begin
k:=true;
For a:=i to i+d-1 do {Kim tra nhng on dc}
Begin
If C[a,j,2] = false then
Begin
k:=false; Goto Ra; End;
If C[a,j+d,2] = false then
Begin
Page 1 of 58
Begi
begin
n
Page 2 of 58
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;
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
Page 3 of 58
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;
Page 4 of 58
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(N2) - 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
Page 5 of 58
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;
Page 6 of 58
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(N 2). 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.
Page 7 of 58
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(Nlog2N), 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;
Page 8 of 58
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;
Page 9 of 58
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.
Page 10 of 58