00001 #ifndef __FASTJET__VORONOI_H__
00002 #define __FASTJET__VORONOI_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 #include "fastjet/ClusterSequenceWithArea.hh"
00061 #include <vector>
00062 #include <math.h>
00063 #include <stdlib.h>
00064 #include <string.h>
00065
00066 #define DELETED -2
00067 #define le 0
00068 #define re 1
00069
00070
00071
00072 FASTJET_BEGIN_NAMESPACE
00073
00074
00075
00076
00077
00078
00079
00080
00081 class Point{
00082 public:
00083
00084 Point() : x(0.0), y(0.0) {}
00085
00086
00087 Point(double _x, double _y) : x(_x), y(_y) {}
00088
00089
00090 inline Point operator + (const Point &p) const{
00091 return Point(x+p.x, y+p.y);
00092 }
00093
00094
00095 inline Point operator - (const Point &p) const{
00096 return Point(x-p.x, y-p.y);
00097 }
00098
00099
00100 inline Point operator * (const double t) const{
00101 return Point(x*t, y*t);
00102 }
00103
00104
00105 double x,y;
00106 };
00107
00108
00109
00110 inline double norm(const Point p){
00111 return p.x*p.x+p.y*p.y;
00112 }
00113
00114
00115
00116 inline double vector_product(const Point &p1, const Point &p2){
00117 return p1.x*p2.y-p1.y*p2.x;
00118 }
00119
00120
00121
00122 inline double scalar_product(const Point &p1, const Point &p2){
00123 return p1.x*p2.x+p1.y*p2.y;
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 class GraphEdge{
00135 public:
00136
00137 double x1,y1,x2,y2;
00138
00139
00140 int point1, point2;
00141
00142
00143 GraphEdge* next;
00144 };
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 class Site{
00155 public:
00156 Point coord;
00157 int sitenbr;
00158 int refcnt;
00159 };
00160
00161
00162
00163 class Freenode{
00164 public:
00165 Freenode *nextfree;
00166 };
00167
00168
00169 class FreeNodeArrayList{
00170 public:
00171 Freenode* memory;
00172 FreeNodeArrayList* next;
00173 };
00174
00175
00176 class Freelist{
00177 public:
00178 Freenode *head;
00179 int nodesize;
00180 };
00181
00182 class Edge{
00183 public:
00184 double a,b,c;
00185 Site *ep[2];
00186 Site *reg[2];
00187 int edgenbr;
00188 };
00189
00190
00191 class Halfedge{
00192 public:
00193 Halfedge *ELleft, *ELright;
00194 Edge *ELedge;
00195 int ELrefcnt;
00196 char ELpm;
00197 Site *vertex;
00198 volatile double ystar;
00199 Halfedge *PQnext;
00200 };
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 class VoronoiDiagramGenerator{
00211 public:
00212 VoronoiDiagramGenerator();
00213 ~VoronoiDiagramGenerator();
00214
00215 bool generateVoronoi(std::vector<Point> *_parent_sites,
00216 double minX, double maxX, double minY, double maxY,
00217 double minDist=0);
00218
00219 inline void resetIterator(){
00220 iteratorEdges = allEdges;
00221 }
00222
00223 bool getNext(GraphEdge **e){
00224 if(iteratorEdges == 0)
00225 return false;
00226
00227 *e = iteratorEdges;
00228 iteratorEdges = iteratorEdges->next;
00229 return true;
00230 }
00231
00232 std::vector<Point> *parent_sites;
00233 int n_parent_sites;
00234
00235 private:
00236 void cleanup();
00237 void cleanupEdges();
00238 char *getfree(Freelist *fl);
00239 Halfedge *PQfind();
00240 int PQempty();
00241
00242 Halfedge **ELhash;
00243 Halfedge *HEcreate(), *ELleft(), *ELright(), *ELleftbnd();
00244 Halfedge *HEcreate(Edge *e,int pm);
00245
00246 Point PQ_min();
00247 Halfedge *PQextractmin();
00248 void freeinit(Freelist *fl,int size);
00249 void makefree(Freenode *curr,Freelist *fl);
00250 void geominit();
00251 void plotinit();
00252 bool voronoi(int triangulate);
00253 void ref(Site *v);
00254 void deref(Site *v);
00255 void endpoint(Edge *e,int lr,Site * s);
00256
00257 void ELdelete(Halfedge *he);
00258 Halfedge *ELleftbnd(Point *p);
00259 Halfedge *ELright(Halfedge *he);
00260 void makevertex(Site *v);
00261 void out_triple(Site *s1, Site *s2,Site * s3);
00262
00263 void PQinsert(Halfedge *he,Site * v, double offset);
00264 void PQdelete(Halfedge *he);
00265 bool ELinitialize();
00266 void ELinsert(Halfedge *lb, Halfedge *newHe);
00267 Halfedge * ELgethash(int b);
00268 Halfedge *ELleft(Halfedge *he);
00269 Site *leftreg(Halfedge *he);
00270 void out_site(Site *s);
00271 bool PQinitialize();
00272 int PQbucket(Halfedge *he);
00273 void clip_line(Edge *e);
00274 char *myalloc(unsigned n);
00275 int right_of(Halfedge *el,Point *p);
00276
00277 Site *rightreg(Halfedge *he);
00278 Edge *bisect(Site *s1, Site *s2);
00279 double dist(Site *s,Site *t);
00280 Site *intersect(Halfedge *el1, Halfedge *el2, Point *p=0);
00281
00282 void out_bisector(Edge *e);
00283 void out_ep(Edge *e);
00284 void out_vertex(Site *v);
00285 Site *nextone();
00286
00287 void pushGraphEdge(double x1, double y1, double x2, double y2,
00288 Site *s1, Site *s2);
00289
00290 void openpl();
00291 void circle(double x, double y, double radius);
00292 void range(double minX, double minY, double maxX, double maxY);
00293
00294 Freelist hfl;
00295 Halfedge *ELleftend, *ELrightend;
00296 int ELhashsize;
00297
00298 int triangulate, sorted, plot, debug;
00299 double xmin, xmax, ymin, ymax, deltax, deltay;
00300
00301 Site *sites;
00302 int nsites;
00303 int siteidx;
00304 int sqrt_nsites;
00305 int nvertices;
00306 Freelist sfl;
00307 Site *bottomsite;
00308
00309 int nedges;
00310 Freelist efl;
00311 int PQhashsize;
00312 Halfedge *PQhash;
00313 int PQcount;
00314 int PQmin;
00315
00316 int ntry, totalsearch;
00317 double pxmin, pxmax, pymin, pymax, cradius;
00318 int total_alloc;
00319
00320 double borderMinX, borderMaxX, borderMinY, borderMaxY;
00321
00322 FreeNodeArrayList* allMemoryList;
00323 FreeNodeArrayList* currentMemoryBlock;
00324
00325 GraphEdge* allEdges;
00326 GraphEdge* iteratorEdges;
00327
00328 double minDistanceBetweenSites;
00329 };
00330
00331 int scomp(const void *p1,const void *p2);
00332
00333
00334 FASTJET_END_NAMESPACE
00335
00336 #endif