Title: Convex Hull (2D)
Question: Given is a set of not ordered points in a plane.
How can I efficiently find the minimal ordered subset of points that build the convex boundary?
Answer:
{---------------------------------------------------------------------------
UCHULL Delphi Unit for V 5.x & 7.x
was former
UCHULL TURBO PASCAL Unit for TP V 6.0 and TPW 1.0, BP & BPW 7.x
---------------------------------------------------------------------------
Author: F.Honegger c/o LENO KBS CH-4031 BASEL
File : UCHULL.PAS
Associated File : UCHULL.TPU
Edit notes and History
1.st edit : 11.03.1992 creation
2.nd edit : 22.05.2000 adaption to D5
3.nd edit : 14.11.2007 compiler switches for D7
The routines are more or less self descriptive. For a intro-
duction to algorithms in computer graphics see
Wolfram Luther, Martin Ohsmann, Mathematischc Grundlagen der
Computergraphik, Vieweg Braunschweig 1988, ISBN 3-528-06302-5.
The routine chull calculates the convex hull of a set of
points. The algorithm implemented here is not subject of the
above reference. It has been developed by the author. The main
subject was to get a handy and flexible routine. The procedure
works as follows.
1. Retrieve points until a triangle is found, or input is
exhausted. If all the points processed lie on a straight
line then the extremal points are returned, and the
procedure finishes. If a triangle was found continue with
next step.
2. Order the points of the triangle mathematically positive
ie. counter clockwise.,
3. If points are exhausted we finish here, otherwise we
get a new point and go to the next step.
4. Verify if the point lies outside the current polygon. If
it does go to the next step, otherwise discard the point
and go to the previous step.
5. Find the left tangent from the point to the polygon.
6. Find the right tangent from the point to the polygon.
7. Build a new polygon, with the new point the tangent
points and the hidden points (points not view by the new
point). Repeat step 3 with the new polygon.
CHull returns a result structure (see type TCHull_Result below). The
dynamic x-field holds the x-coordinates, the dynamic y-field the
y-cordinates and the dynamic ix field the indexes of the returned points as
they are read. The first and last item of each field equals if and only
if the convex hull is a closed curve. CHull reads the point coordinates
using a user supplied input routine. Its address is passed by calling
CHull. If CHull fails, it returns nil arrays in its result record. The only
reasons of failure are heap overflow and structure overflow. If nupmax_idx
then a structure overflow has occurred. If nup has occurred.
}
{$IFNDEF win32}
The comiler switches and the code must be revised for version not having
win32 defined
{$ENDIF}
{$IFDEF ver130}
{$DEFINE CompileOk}
{$ENDIF}
{$IFDEF ver150}
{$DEFINE CompileOk}
{$ENDIF}
{$IFNDEF CompileOk}
The comiler switches and the code must be revised for version different to
13.0
{$ENDIF}
{$IFDEF CompileOk}
{$A-} {allign data or packed records- = byte }
{$B+} {Boolean complete evaluation - = on }
{$D+} {debug info - = off }
{$L+} {local symbols + = yes }
{$R-} {Range check - = off }
{$S-} {Stack checking on - = off }
{$I+} {I/O checking on + = on }
{$G-} {importdata references + = on }
{$X-} {extended sytax + = on }
{$O+} {Code optimisation + = on }
{$H+} {Long Strings + = on }
{$P+} {open string paramters if H- + = on }
{$V+} {varstring checks if short strings + = on }
{$C+} {Build code assertions + = on }
{$E-}
{$F-}
{$J+} {Writeable typed constants + = on }
{$K-}
{$M-}
{$N+}
{$Q-} {Overflow check + = on }
{$S-}
{$T-} {Typed addresse + = on }
{$U-} {Save pentium divide + = on }
{$W-} {Always make stackframes + = on }
{$Y+} {Symbol creation + = on }
{$Z1} {Minimum Size a Enum Type is stored (in conj. with C }
{$ENDIF}
unit Uchull;
interface
const
Max_idx=(Maxint SHR 3)-1;
type
TArrayOfDouble = array of double;
TArrayOfInteger = array of Integer;
TchullResult = record
Nup:Integer;
x:TArrayOfDouble;
y:TArrayOfDouble;
Ix:TArrayOfInteger;
end;
TOgetnp = function(var x,y:Double):Boolean of object;
Tgetnp = function(var x,y:Double):Boolean;
procedure Chull(OGetnp:TOgetnp;Getnp:Tgetnp; Var ResultRec:TchullResult);
implementation
Uses
Sysutils;
procedure SwapInteger(var a,b:Integer);
VAR
C:Integer;
{code is optimal when code optimisation switch is enabled}
BEGIN
c:=a;
a:=b;
b:=c;
END;
procedure SwapDouble(var a,b: double);assembler;
{c:=a; a:=b; b:=c; }
Asm
{load a on stop}
Fld Qword Ptr [eax]
{load b on stop}
Fld Qword Ptr [edx]
{save stop as a}
Fstp Qword Ptr [eax]
{save stop as b}
Fstp Qword Ptr [edx]
FWAIT
end;
procedure Chull(OGetnp:TOgetnp;Getnp:Tgetnp; Var ResultRec:TchullResult);
{Calculates iteratively the convex hull of a set of points, given by the
coordinate vectors x,y.
Input getnp address of a input routine of tye tgetnp
Output pointer to address record of the address fields.
}
label
End_pre,Chull_end,Error_exit;
var
{pointers to fields that hold coordinates of points}
x,y,X1,Y1:TArrayOfDouble;
{coordinates of point to be classified and processed}
Xp,Yp:Double;
{pointers to fileds that hold indexes of points}
Nn,Nn1:TArrayOfInteger;
{size of fields in bytes while classifying point}
Xysize,Nnsize:Word;
{size of fields in bytes after classifiying new point}
Nxysize,Nnnsize:Word;
{number of points of polygon befor/after processing new point}
Np,Npn:Integer;
{number of points processed}
Points_fetched:Integer;
{work variables}
Xi,Yi :Double;
Dx,Dy,Dx1,Dy1 :Double;
d,Di :Double;
Df :array[1..3] of double;
i,Ii,Ioi,SI,k,Dc :Integer;
{flags}
Iii :array[1..3] of Byte;
Ok,Out :Boolean;
begin
{we allocate space for three points, the extra field at zero offset is
used for memory management only}
Assert(Assigned(GetNp) xor Assigned(OGetNp),'Please pass one input routine only');
Np:=3;
Npn:=Np;
Xysize:=(Np+2) * SizeOf(Double);
Nnsize:=(Np+2) * SizeOf(Integer);
SetLength(Nn,Nnsize);
SetLength(x,Xysize);
SetLength(y,Xysize);
SetLength(Nn1,0);
SetLength(x1,0);
SetLength(y1,0);
Points_fetched:=0;
i:=1;
{try to read first three points}
ok:=false;
repeat
if Assigned(GetNp) then Ok:=Getnp(x[i],y[i]);
if Assigned(OGetNp) then Ok:=OGetnp(x[i],y[i]);
if Ok then
begin
Inc(i);
{increment pointcounter}
Inc(Points_fetched);
Nn[i]:=Points_fetched;
end;
until (not Ok) or (Points_fetched=3);
{ lets handle the trivial case (less then 3 points)}
if Points_fetched begin
if Points_fetched=0 then
begin
Resultrec.Nup:=0;
end else if Points_fetched=1 then
begin
Resultrec.Nup:=1;
end
else if Points_fetched=2 then
begin
if (x[1]=x[2]) and (y[1]=y[2]) then
begin
Resultrec.Nup:=1;
end else begin
Resultrec.Nup:=2;
end;
end;
end else begin
{then the non trivial case}
for i:=1 TO 4 do Nn[i]:=i;
{search for a triangle}
while TRUE do
begin
FillChar(Iii,SizeOf(Iii),0);
if ( x[1]=x[2] ) and ( y[1]=y[2] ) then Iii[1]:=1;
if ( x[1]=x[3] ) and ( y[1]=y[3] ) then Iii[2]:=1;
if ( x[2]=x[3] ) and ( y[2]=y[3] ) then Iii[3]:=1;
Ii:=0;
for i:=1 TO 3 do Ii:=Ii+Iii[i];
case Ii OF
3: begin
Ii:=2;
Iii[1]:=1;
Iii[2]:=0;
Iii[3]:=0;
end;
1: begin
if Iii[1]=1 then
begin
for i:=1 TO 2 do
begin
x[i]:=x[i+1];
y[i]:=y[i+1];
Nn[i]:=Nn[i+1];
end;
end;
for i:=1 TO 2 do Iii[i]:=1;
Iii[3]:=0;
end;
0: begin
{are points collinear ?}
d:=(y[2]-y[1])*(x[3]-x[1])-(y[3]-y[1])*(x[2]-x[1]);
{no we got a triangle}
if d0 then goto End_pre;
{yes we will extract the to extremal points, by comparing euclidean
distances}
Df[1]:=Sqr(x[1]-x[2])+Sqr(y[1]-y[2]);
Df[2]:=Sqr(x[1]-x[3])+Sqr(y[1]-y[3]);
Df[3]:=Sqr(x[3]-x[2])+Sqr(y[3]-y[2]);
d:=0;
for i:=1 TO 3 do
if Df[i]d then
begin
k:=i;
d:=Df[i];
end;
case k OF
2: begin
x[2]:=x[3];
y[2]:=y[3];
Nn[2]:=Nn[3];
Iii[1]:=1;
Iii[2]:=1;
end;
3: begin
for i:=1 TO 2 do
begin
x[i]:=x[i+1];
y[i]:=y[i+1];
Nn[i]:=Nn[i+1];
Iii[i]:=1;
end;
end;
1: begin
for i:=1 TO 2 do Iii[i]:=1;
end;
end;
Iii[3]:=0;
Ii:=1;
end;
end{case};
Ok:=TRUE;
{replace rejected points}
for i:=2 TO 3 do
if (Iii[i]=0) and Ok then
begin
if Assigned(GetNp) then Ok:=Getnp(Xp,Yp);
if Assigned(OGetNp) then Ok:=OGetnp(Xp,Yp);
if Ok then
begin
{increment pointcounter}
Inc(Points_fetched);
Nn[i]:=Points_fetched;
x[i]:=Xp;
y[i]:=Yp;
Dec(Ii);
end;
end;
{if the points are exhausted here the problem reduces to the trivial case}
if (not Ok) or (Ii0) then
begin
if Ii=2 then
begin
Resultrec.Nup:=1;
end else begin
Resultrec.Nup:=2;
end;
goto Chull_end;
end;
end;
End_pre:
{here we are with a triangle}
{lets run through it in the positive sense}
if d0 then
begin
SwapInteger(Nn[1],Nn[2]);
SwapDouble(x[1],x[2]);
SwapDouble(y[1],y[2]);
end;
if Assigned(GetNp) then Ok:=Getnp(Xp,Yp);
if Assigned(OGetNp) then Ok:=OGetnp(Xp,Yp);
{ for all new points repeat}
while Ok do
begin
{increment pointcounter}
Inc(Points_fetched);
{check if points lies inside or outside of the polygon}
i:=1; Out:=FALSE;
while (i begin
if i Xi:=x[i]; Yi:=y[i];
d:=(x[Ii]-Xi)*(Yp-Yi)-(y[Ii]-Yi)*(Xp-Xi);
if d end;
{ point lies outside the polygon. we have some work}
if Out then
begin
{ find the position in polygon where to insert the new point}
Ok:=FALSE;
Di:=0;
SI:=0;
while not Ok do
begin
{To enhance speed, we run clockwise or counter clockwise through the polygon
depending on the sign of the first d.}
if (SI=-1) or (SI=0) then
begin
if i1 then Dec(i) else i:=Np;
end else
begin
if i end;
if i
Xi:=x[i]; Yi:=y[i];
Dx1:=x[Ii]-Xi; Dy1:=y[Ii]-Yi; Dx:=Xp-Xi; Dy:=Yp-Yi;
d:=Dx*Dy1-Dy*Dx1;
if Abs(d)=0 then
begin
Out:=FALSE;
if Abs(Dx)=0 then
begin
if Dy*Dy10 then Ok:=TRUE
end else begin
if Dx*Dx10 then Ok:=TRUE
end;
SI:=1;
end else begin
if SI=0 then
begin
if d0 then
SI:=-1
else SI:=1;
Di:=-SI;
end;
if (SI*d0) and (SI*Di begin
Ok:=TRUE;
Out:=TRUE;
end;
end;
Di:=d;
end;
{if went clockwise we must adjust the position index}
if (SI=-1) and (d0) then
if i=Np then i:=1 else Inc(i);
Ioi:=i;
{figure out how many points after the newly inserted must be deleted}
if Out then
begin
{ preset delete counter}
Dc:=0;
if Ioi=Np then i:=1 else i:=Succ(Ioi);
end else begin
{ preset delete counter}
Dc:=1;
if Ioi=Np-1 then i:=1 else
if Ioi=Np then i:=2 else i:=Ioi+2;
end;
Ok:=TRUE;
while (iIoi) and Ok do
begin
if i=Np then Ii:=1 else Ii:=Succ(i);
Xi:=x[i]; Yi:=y[i];
d:=(Xi-Xp)*(y[Ii]-Yp)-(Yi-Yp)*(x[Ii]-Xp);
if d begin
i:=Ii;
Inc(Dc);
end else Ok:=FALSE;{i:=Ioi;}
end;
{adjust counter in the collinear case}
if Abs(d)=0 then Inc(Dc);
{allocate new dimensioned index/data buffers}
Npn:=(Np+1-Dc);
{structure overflow ?}
if NpnMax_idx then goto Error_exit;
Nxysize:=SizeOf(Double)*(Npn+2);
Nnnsize:=SizeOf(Integer)*(Npn+2);
Nn1:=Nn;
SetLength(Nn,Nnnsize);
X1:=x;
SetLength(x,Nxysize);
Y1:=y;
SetLength(y,Nxysize);
if Ioi=Np then i:=1 else i:=Succ(Ioi);
for k:=1 TO Dc do
if i=Np then i:=1 else Inc(i);
{ shuffle indexes}
k:=1;
x[k]:=X1[Ioi];
y[k]:=Y1[Ioi];
Nn[k]:=Nn1[Ioi];
Inc(k);
x[k]:=Xp;
y[k]:=Yp;
Nn[k]:=Points_fetched;
Inc(k);
while iIoi do
begin
x[k]:=X1[i];
y[k]:=Y1[i];
Nn[k]:=Nn1[i];
Inc(k);
if i=Np then i:=1 else Inc(i);
end;
Xysize:=Nxysize;
Nnsize:=Nnnsize;
Np:=Npn;
end;
if Assigned(GetNp) then Ok:=Getnp(Xp,Yp);
if Assigned(OGetNp) then Ok:=OGetnp(Xp,Yp);
end;
x[Np+1]:=x[1];
y[Np+1]:=y[1];
Nn[Np+1]:=Nn[1];
Resultrec.Nup:=Np+1;
end{else};
Chull_end:
Resultrec.x:=copy(x,1,Resultrec.Nup);
Resultrec.y:=copy(y,1,Resultrec.Nup);
Resultrec.Ix:=copy(Nn,1,Resultrec.Nup);
Exit;
Error_exit:
{reinit result record}
SetLength(Resultrec.Ix,0);
SetLength(Resultrec.x,0);
SetLength(Resultrec.y,0);
Resultrec.Nup:=Npn;
end{Chull};
end{Uchull}.
Attached is a zipped sample project that shows the unit in action!
Copy the text below the dashed line in to a text editor and save it as UCHullTest.b64. Check that the empty line after the MIME header is not removed. After you can use a tool like uudeView (http://www.miken.com/uud/) or the built in feature of TotalCommander
(http://www.ghisler.ch) do extract the zip.
-----------------------------------------------------------------
MIME-Version: 1.0
Content-Type: application/octet-stream; name="UCHullTest.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="UCHullTest.zip"
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
ACAAAAApAAAAVUNIdWxsVGVzdC9kYXRldGltZS5pbmNQSwECFAAUAAIACACqTm43RLT+Fs4RAACt
HgAAFQAAAAAAAAAAACAAAACvAAAAVUNIdWxsVGVzdC9VY2h1bGwuZGN1UEsBAhQAFAACAAgAoE5u
N+heOazyEgAA/j0AABUAAAAAAAAAAAAgAAAAsBIAAFVDSHVsbFRlc3QvVWNodWxsLnBhc1BLAQIU
ABQAAgAIANs8SCuNayB4yAAAAHoBAAAZAAAAAAAAAAAAIAAAANUlAABVQ0h1bGxUZXN0L1VDSHVs
bFRlc3QuY2ZnUEsBAhQAFAACAAgAmGZFK+EcEsdGAgAALgcAABkAAAAAAAAAAAAgAAAA1CYAAFVD
SHVsbFRlc3QvVUNIdWxsVGVzdC5kZm1QSwECFAAUAAIACADbPEgr52xpQYgCAABwBQAAGQAAAAAA
AAAAACAAAABRKQAAVUNIdWxsVGVzdC9VQ0h1bGxUZXN0LmRvZlBLAQIUABQAAgAIAK1zRSss5JNj
mAAAAAYBAAAZAAAAAAAAAAAAIAAAABAsAABVQ0h1bGxUZXN0L1VDSHVsbFRlc3QuZHByUEsBAhQA
FAACAAgAr05uN/CXiFrWBQAAxhQAABkAAAAAAAAAAAAgAAAA3ywAAFVDSHVsbFRlc3QvVUNIdWxs
VGVzdC5kc2tQSwECFAAUAAIACAAaZ0UrTix2/IIBAADoAgAAGQAAAAAAAAAAACAAAADsMgAAVUNI
dWxsVGVzdC9VQ0h1bGxUZXN0LnBhc1BLAQIUABQAAgAIAPdlRSvTwnk7cQEAAGwDAAAZAAAAAAAA
AAAAIAAAAKU0AABVQ0h1bGxUZXN0L1VDSHVsbFRlc3QucmVzUEsBAhQAFAACAAgAukxuNxqSZqfc
DAAACxkAAB0AAAAAAAAAAAAgAAAATTYAAFVDSHVsbFRlc3QvVUNIdWxsVGVzdE1haW4uZGN1UEsB
AhQAFAACAAgArzxIKyoTXV21AgAAIAgAAB0AAAAAAAAAAAAgAAAAZEMAAFVDSHVsbFRlc3QvVUNI
dWxsVGVzdE1haW4uZGZtUEsBAhQAFAACAAgAJzxIK6+NhmfjAwAAZAoAAB0AAAAAAAAAAAAgAAAA
VEYAAFVDSHVsbFRlc3QvVUNIdWxsVGVzdE1haW4ucGFzUEsFBgAAAAAOAA4A1gMAAHJKAAAAAA==