mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-04-15 05:32:21 +00:00
.. from C to a C++ class. Moved the original code to a sundirectory for reference and moved all the global variables and methods into a new class called Voronoi. .. the code still needs more work but wanted to remove the global variables as there were lots and a big risk they interact with other parts of the codebase and libraries.
189 lines
4.1 KiB
C
189 lines
4.1 KiB
C
|
|
/*** EDGELIST.C ***/
|
|
|
|
#include "vdefs.h"
|
|
|
|
int ELhashsize ;
|
|
Site * bottomsite ;
|
|
Freelist hfl ;
|
|
Halfedge * ELleftend, * ELrightend, **ELhash ;
|
|
|
|
int ntry, totalsearch ;
|
|
|
|
void
|
|
ELinitialize(void)
|
|
{
|
|
int i ;
|
|
|
|
freeinit(&hfl, sizeof(Halfedge)) ;
|
|
ELhashsize = 2 * sqrt_nsites ;
|
|
ELhash = (Halfedge **)myalloc( sizeof(*ELhash) * ELhashsize) ;
|
|
for (i = 0 ; i < ELhashsize ; i++)
|
|
{
|
|
ELhash[i] = (Halfedge *)NULL ;
|
|
}
|
|
ELleftend = HEcreate((Edge *)NULL, 0) ;
|
|
ELrightend = HEcreate((Edge *)NULL, 0) ;
|
|
ELleftend->ELleft = (Halfedge *)NULL ;
|
|
ELleftend->ELright = ELrightend ;
|
|
ELrightend->ELleft = ELleftend ;
|
|
ELrightend->ELright = (Halfedge *)NULL ;
|
|
ELhash[0] = ELleftend ;
|
|
ELhash[ELhashsize-1] = ELrightend ;
|
|
}
|
|
|
|
Halfedge *
|
|
HEcreate(Edge * e, int pm)
|
|
{
|
|
Halfedge * answer ;
|
|
|
|
answer = (Halfedge *)getfree(&hfl) ;
|
|
answer->ELedge = e ;
|
|
answer->ELpm = pm ;
|
|
answer->PQnext = (Halfedge *)NULL ;
|
|
answer->vertex = (Site *)NULL ;
|
|
answer->ELrefcnt = 0 ;
|
|
return (answer) ;
|
|
}
|
|
|
|
void
|
|
ELinsert(Halfedge * lb, Halfedge * new)
|
|
{
|
|
new->ELleft = lb ;
|
|
new->ELright = lb->ELright ;
|
|
(lb->ELright)->ELleft = new ;
|
|
lb->ELright = new ;
|
|
}
|
|
|
|
/* Get entry from hash table, pruning any deleted nodes */
|
|
|
|
Halfedge *
|
|
ELgethash(int b)
|
|
{
|
|
Halfedge * he ;
|
|
|
|
if ((b < 0) || (b >= ELhashsize))
|
|
{
|
|
return ((Halfedge *)NULL) ;
|
|
}
|
|
he = ELhash[b] ;
|
|
if ((he == (Halfedge *)NULL) || (he->ELedge != (Edge *)DELETED))
|
|
{
|
|
return (he) ;
|
|
}
|
|
/* Hash table points to deleted half edge. Patch as necessary. */
|
|
ELhash[b] = (Halfedge *)NULL ;
|
|
if ((--(he->ELrefcnt)) == 0)
|
|
{
|
|
makefree((Freenode *)he, (Freelist *)&hfl) ;
|
|
}
|
|
return ((Halfedge *)NULL) ;
|
|
}
|
|
|
|
Halfedge *
|
|
ELleftbnd(Point * p)
|
|
{
|
|
int i, bucket ;
|
|
Halfedge * he ;
|
|
|
|
/* Use hash table to get close to desired halfedge */
|
|
bucket = (p->x - xmin) / deltax * ELhashsize ;
|
|
if (bucket < 0)
|
|
{
|
|
bucket = 0 ;
|
|
}
|
|
if (bucket >= ELhashsize)
|
|
{
|
|
bucket = ELhashsize - 1 ;
|
|
}
|
|
he = ELgethash(bucket) ;
|
|
if (he == (Halfedge *)NULL)
|
|
{
|
|
for (i = 1 ; 1 ; i++)
|
|
{
|
|
if ((he = ELgethash(bucket-i)) != (Halfedge *)NULL)
|
|
{
|
|
break ;
|
|
}
|
|
if ((he = ELgethash(bucket+i)) != (Halfedge *)NULL)
|
|
{
|
|
break ;
|
|
}
|
|
}
|
|
totalsearch += i ;
|
|
}
|
|
ntry++ ;
|
|
/* Now search linear list of halfedges for the corect one */
|
|
if (he == ELleftend || (he != ELrightend && right_of(he,p)))
|
|
{
|
|
do {
|
|
he = he->ELright ;
|
|
} while (he != ELrightend && right_of(he,p)) ;
|
|
he = he->ELleft ;
|
|
}
|
|
else
|
|
{
|
|
do {
|
|
he = he->ELleft ;
|
|
} while (he != ELleftend && !right_of(he,p)) ;
|
|
}
|
|
/*** Update hash table and reference counts ***/
|
|
if ((bucket > 0) && (bucket < ELhashsize-1))
|
|
{
|
|
if (ELhash[bucket] != (Halfedge *)NULL)
|
|
{
|
|
(ELhash[bucket]->ELrefcnt)-- ;
|
|
}
|
|
ELhash[bucket] = he ;
|
|
(ELhash[bucket]->ELrefcnt)++ ;
|
|
}
|
|
return (he) ;
|
|
}
|
|
|
|
/*** This delete routine can't reclaim node, since pointers from hash
|
|
: table may be present.
|
|
***/
|
|
|
|
void
|
|
ELdelete(Halfedge * he)
|
|
{
|
|
(he->ELleft)->ELright = he->ELright ;
|
|
(he->ELright)->ELleft = he->ELleft ;
|
|
he->ELedge = (Edge *)DELETED ;
|
|
}
|
|
|
|
Halfedge *
|
|
ELright(Halfedge * he)
|
|
{
|
|
return (he->ELright) ;
|
|
}
|
|
|
|
Halfedge *
|
|
ELleft(Halfedge * he)
|
|
{
|
|
return (he->ELleft) ;
|
|
}
|
|
|
|
Site *
|
|
leftreg(Halfedge * he)
|
|
{
|
|
if (he->ELedge == (Edge *)NULL)
|
|
{
|
|
return(bottomsite) ;
|
|
}
|
|
return (he->ELpm == le ? he->ELedge->reg[le] :
|
|
he->ELedge->reg[re]) ;
|
|
}
|
|
|
|
Site *
|
|
rightreg(Halfedge * he)
|
|
{
|
|
if (he->ELedge == (Edge *)NULL)
|
|
{
|
|
return(bottomsite) ;
|
|
}
|
|
return (he->ELpm == le ? he->ELedge->reg[re] :
|
|
he->ELedge->reg[le]) ;
|
|
}
|
|
|