#include <Edgelist.h>
Public Member Functions | ||||
EdgeList () | ||||
Standard constructor. | ||||
void | initialize (int sqrt_nsites, double xmin, double deltax, Site *bottomsite) | |||
| ||||
void | reset () | |||
Resets the list for further use. | ||||
Halfedge * | HEcreate (Edge *e, int pm) | |||
| ||||
void | ELinsert (Halfedge *lb, Halfedge *new_he) | |||
| ||||
Halfedge * | ELgethash (int b) | |||
| ||||
Halfedge * | ELleftbnd (Point *p) | |||
| ||||
void | ELdelete (Halfedge *he) | |||
| ||||
Halfedge * | ELright (Halfedge *he) | |||
| ||||
Halfedge * | ELleft (Halfedge *he) | |||
| ||||
Site * | leftreg (Halfedge *he) | |||
| ||||
Site * | rightreg (Halfedge *he) | |||
| ||||
int | right_of (Halfedge *el, Point *p) | |||
| ||||
Public Attributes | ||||
Halfedge * | ELleftend | |||
Halfedge * | ELrightend | |||
Protected Attributes | ||||
int | ELhashsize | |||
int | totalsearch | |||
int | ntry | |||
int | HEcount | |||
double | xmin | |||
double | deltax | |||
Halfedge ** | ELhash | |||
Halfedge ** | HEmemmap | |||
Site * | bottomsite |
EdgeList::EdgeList | ( | ) |
void EdgeList::initialize | ( | int | sqrt_nsites, | |
double | xmin, | |||
double | deltax, | |||
Site * | bottomsite | |||
) |
sqrt_nsites | Squareroot of the total number of sites. |
xmin | Min x coordinate of all sites. | |
deltax | xmin+deltax is max x coordinate of all sites. | |
bottomsite | A pointer to the bottom site of the sites list. |
00032 { 00033 int i; 00034 00035 HEcount = 0; 00036 ELhashsize = 2 * sqrt_nsites; 00037 00038 HEmemmap = new Halfedge*[ELhashsize]; 00039 00040 ELhash = new Halfedge*[ELhashsize]; 00041 for(i=0; i<ELhashsize; i++) ELhash[i] = NULL; 00042 ELleftend = HEcreate(NULL, 0); 00043 ELrightend = HEcreate(NULL, 0); 00044 ELleftend->ELleft = NULL; 00045 ELleftend->ELright = ELrightend; 00046 ELrightend->ELleft = ELleftend; 00047 ELrightend->ELright = NULL; 00048 ELhash[0] = ELleftend; 00049 ELhash[ELhashsize-1] = ELrightend; 00050 this->xmin = xmin; 00051 this->deltax = deltax; 00052 this->bottomsite = bottomsite; 00053 }
void EdgeList::reset | ( | ) |
e | A pointer to an edge. |
pm | Determins wether the halfedge represents the left or right "side" of the given edge (le/re). |
00064 { 00065 Halfedge *answer = new Halfedge; 00066 answer->ELedge = e; 00067 answer->ELpm = pm; 00068 00069 HEmemmap[HEcount++] = answer; 00070 if(HEcount%ELhashsize == 0) { 00071 Halfedge **Temp = new Halfedge*[HEcount + ELhashsize]; 00072 for(int i=0; i<HEcount; i++) Temp[i] = HEmemmap[i]; 00073 delete[] HEmemmap; 00074 HEmemmap = Temp; 00075 } 00076 return answer; 00077 }
Halfedge * EdgeList::ELgethash | ( | int | b | ) |
b | An integer. |
00089 { 00090 Halfedge *he; 00091 00092 if(b < 0 || b >= ELhashsize) return NULL; 00093 he = ELhash[b]; 00094 if(he == NULL || he->ELedge != (Edge*)DELETED) return he; 00095 00096 /* Hash table points to deleted half edge. */ 00097 ELhash[b] = NULL; 00098 return NULL; 00099 }
p | A pointer to a point. |
00145 { 00146 int i, bucket; 00147 Halfedge *he; 00148 00149 /* Use hash table to get close to desired halfedge */ 00150 bucket = (int)((p->x - xmin) / deltax) * ELhashsize; 00151 if(bucket < 0) bucket =0; 00152 if(bucket >= ELhashsize) bucket = ELhashsize - 1; 00153 he = ELgethash(bucket); 00154 if(he == NULL) { 00155 for(i=1; 1; i++) { 00156 if((he = ELgethash(bucket-i)) != NULL) break; 00157 if((he = ELgethash(bucket+i)) != NULL) break; 00158 } 00159 totalsearch++; 00160 } 00161 ntry++; 00162 /* Now search linear list of halfedges for the corect one */ 00163 if(he == ELleftend || (he != ELrightend && right_of(he, p))) { 00164 do {he = he->ELright;} while(he != ELrightend && right_of(he, p)); 00165 he = he->ELleft; 00166 } 00167 else do {he = he->ELleft;} while(he != ELleftend && !right_of(he, p)); 00168 00169 /* Update hash table and reference counts */ 00170 if(bucket > 0 && bucket < ELhashsize-1) { 00171 ELhash[bucket] = he; 00172 } 00173 return he; 00174 }
void EdgeList::ELdelete | ( | Halfedge * | he | ) |
he | A halfedge. |
00184 { 00185 return he->ELright; 00186 }
he | A halfedge. |
00189 { 00190 return he->ELleft; 00191 }
he | A halfedge. |
p | A point. |
00103 { 00104 Edge *e; 00105 Site *topsite; 00106 int right_of_site, above, fast; 00107 double dxp, dyp, dxs, t1, t2, t3, yl; 00108 00109 e = el->ELedge; 00110 topsite = e->reg[1]; 00111 right_of_site = p->x > topsite->coord.x; 00112 if(right_of_site && el->ELpm == le) return 1; 00113 if(!right_of_site && el->ELpm == re) return 0; 00114 00115 if(e->a == 1.0) { 00116 dyp = p->y - topsite->coord.y; 00117 dxp = p->x - topsite->coord.x; 00118 fast = 0; 00119 if((!right_of_site & e->b < 0.0) | (right_of_site & e->b >= 0.0)) { 00120 above = dyp >= e->b * dxp; 00121 fast = above; 00122 } 00123 else { 00124 above = p->x + p->y * e->b > e->c; 00125 if(e->b < 0.0) above = !above; 00126 if(!above) fast = 1; 00127 } 00128 if(!fast) { 00129 dxs = topsite->coord.x - (e->reg[0])->coord.x; 00130 above = e->b * (dxp*dxp - dyp*dyp) < dxs * dyp * (1.0 + 2.0*dxp/dxs + e->b*e->b); 00131 if(e->b < 0.0) above = !above; 00132 } 00133 } 00134 else { 00135 yl = e->c - e->a * p->x; 00136 t1 = p->y - yl; 00137 t2 = p->x - topsite->coord.x; 00138 t3 = yl - topsite->coord.y; 00139 above = t1*t1 > t2*t2 + t3*t3; 00140 } 00141 return el->ELpm == le ? above : !above; 00142 }
int EdgeList::ELhashsize [protected] |
int EdgeList::totalsearch [protected] |
int EdgeList::ntry [protected] |
int EdgeList::HEcount [protected] |
double EdgeList::xmin [protected] |
double EdgeList::deltax [protected] |
Halfedge** EdgeList::ELhash [protected] |
Halfedge** EdgeList::HEmemmap [protected] |
Site* EdgeList::bottomsite [protected] |