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.
119 lines
2.1 KiB
C
119 lines
2.1 KiB
C
|
|
/*** HEAP.C ***/
|
|
|
|
|
|
#include "vdefs.h"
|
|
|
|
int PQmin, PQcount, PQhashsize ;
|
|
Halfedge * PQhash ;
|
|
|
|
void
|
|
PQinsert(Halfedge * he, Site * v, float offset)
|
|
{
|
|
Halfedge * last, * next ;
|
|
|
|
he->vertex = v ;
|
|
ref(v) ;
|
|
he->ystar = v->coord.y + offset ;
|
|
last = &PQhash[ PQbucket(he)] ;
|
|
while ((next = last->PQnext) != (Halfedge *)NULL &&
|
|
(he->ystar > next->ystar ||
|
|
(he->ystar == next->ystar &&
|
|
v->coord.x > next->vertex->coord.x)))
|
|
{
|
|
last = next ;
|
|
}
|
|
he->PQnext = last->PQnext ;
|
|
last->PQnext = he ;
|
|
PQcount++ ;
|
|
}
|
|
|
|
void
|
|
PQdelete(Halfedge * he)
|
|
{
|
|
Halfedge * last;
|
|
|
|
if(he -> vertex != (Site *) NULL)
|
|
{
|
|
last = &PQhash[PQbucket(he)] ;
|
|
while (last -> PQnext != he)
|
|
{
|
|
last = last->PQnext ;
|
|
}
|
|
last->PQnext = he->PQnext;
|
|
PQcount-- ;
|
|
deref(he->vertex) ;
|
|
he->vertex = (Site *)NULL ;
|
|
}
|
|
}
|
|
|
|
int
|
|
PQbucket(Halfedge * he)
|
|
{
|
|
int bucket ;
|
|
|
|
|
|
if (he->ystar < ymin) bucket = 0;
|
|
else if (he->ystar >= ymax) bucket = PQhashsize-1;
|
|
else bucket = (he->ystar - ymin)/deltay * PQhashsize;
|
|
if (bucket < 0)
|
|
{
|
|
bucket = 0 ;
|
|
}
|
|
if (bucket >= PQhashsize)
|
|
{
|
|
bucket = PQhashsize-1 ;
|
|
}
|
|
if (bucket < PQmin)
|
|
{
|
|
PQmin = bucket ;
|
|
}
|
|
return (bucket);
|
|
}
|
|
|
|
int
|
|
PQempty(void)
|
|
{
|
|
return (PQcount == 0) ;
|
|
}
|
|
|
|
|
|
Point
|
|
PQ_min(void)
|
|
{
|
|
Point answer ;
|
|
|
|
while (PQhash[PQmin].PQnext == (Halfedge *)NULL)
|
|
{
|
|
++PQmin ;
|
|
}
|
|
answer.x = PQhash[PQmin].PQnext->vertex->coord.x ;
|
|
answer.y = PQhash[PQmin].PQnext->ystar ;
|
|
return (answer) ;
|
|
}
|
|
|
|
Halfedge *
|
|
PQextractmin(void)
|
|
{
|
|
Halfedge * curr ;
|
|
|
|
curr = PQhash[PQmin].PQnext ;
|
|
PQhash[PQmin].PQnext = curr->PQnext ;
|
|
PQcount-- ;
|
|
return (curr) ;
|
|
}
|
|
|
|
void
|
|
PQinitialize(void)
|
|
{
|
|
int i ;
|
|
|
|
PQcount = PQmin = 0 ;
|
|
PQhashsize = 4 * sqrt_nsites ;
|
|
PQhash = (Halfedge *)myalloc(PQhashsize * sizeof *PQhash) ;
|
|
for (i = 0 ; i < PQhashsize; i++)
|
|
{
|
|
PQhash[i].PQnext = (Halfedge *)NULL ;
|
|
}
|
|
}
|