Mega Code Archive

 
Categories / Delphi / Graphic
 

Convex Hull (2D)

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==