Future's Algorithm

.. for calculating Vornoi diagrams.
This commit is contained in:
Mark Liversedge
2021-09-28 19:28:42 +01:00
parent 4c720884b6
commit 53ee8f358c
14 changed files with 2251 additions and 1 deletions

30
contrib/voronoi/Doc Normal file
View File

@@ -0,0 +1,30 @@
voronoi - compute Voronoi diagram or Delaunay triangulation
SYNOPSIS
voronoi [-s -t] <pointfile >outputfile
Voronoi reads the standard input for a set of points in the plane and writes either
the Voronoi diagram or the Delaunay triangulation to the standard output.
Each input line should consist of two real numbers, separated by white space.
If option
-t
is present, the Delaunay triangulation is produced.
Each output line is a triple
i j k
which are the indices of the three points in a Delaunay triangle. Points are
numbered starting at 0. If this option is not present, the
Voronoi diagram is produced. There are four output record types.
s a b
indicates that an input point at coordinates
l a b c
indicates a line with equation ax + by = c.
v a b
indicates a vertex at a b.
e l v1 v2
indicates a Voronoi segment which is a subsegment of line number l;
with endpoints numbered v1 and v2. If v1 or v2 is -1, the line
extends to infinity.
AUTHOR
Steve J. Fortune (1987) A Sweepline Algorithm for Voronoi Diagrams,
Algorithmica 2, 153-174.

View File

@@ -0,0 +1,14 @@
C=edgelist.c geometry.c heap.c main.c memory.c output.c voronoi.c
O=edgelist.o geometry.o heap.o main.o memory.o output.o voronoi.o
tt: voronoi t
./voronoi <t >tt
voronoi: $O
cc -o voronoi $O -lm
$O:vdefs.h
voronoi.tar : $C vdefs.h Makefile Doc t
tar -cf voronoi.tar $C vdefs.h Makefile Doc t
mailable: $C vdefs.h Makefile t
bundle $C vdefs.h Makefile t > mailable

188
contrib/voronoi/edgelist.c Normal file
View File

@@ -0,0 +1,188 @@
/*** 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]) ;
}

221
contrib/voronoi/geometry.c Normal file
View File

@@ -0,0 +1,221 @@
/*** GEOMETRY.C ***/
#include <math.h>
#include "vdefs.h"
float deltax, deltay ;
int nedges, sqrt_nsites, nvertices ;
Freelist efl ;
void
geominit(void)
{
freeinit(&efl, sizeof(Edge)) ;
nvertices = nedges = 0 ;
sqrt_nsites = sqrt(nsites+4) ;
deltay = ymax - ymin ;
deltax = xmax - xmin ;
}
Edge *
bisect(Site * s1, Site * s2)
{
float dx, dy, adx, ady ;
Edge * newedge ;
newedge = (Edge *)getfree(&efl) ;
newedge->reg[0] = s1 ;
newedge->reg[1] = s2 ;
ref(s1) ;
ref(s2) ;
newedge->ep[0] = newedge->ep[1] = (Site *)NULL ;
dx = s2->coord.x - s1->coord.x ;
dy = s2->coord.y - s1->coord.y ;
adx = dx>0 ? dx : -dx ;
ady = dy>0 ? dy : -dy ;
newedge->c = s1->coord.x * dx + s1->coord.y * dy + (dx*dx +
dy*dy) * 0.5 ;
if (adx > ady)
{
newedge->a = 1.0 ;
newedge->b = dy/dx ;
newedge->c /= dx ;
}
else
{
newedge->b = 1.0 ;
newedge->a = dx/dy ;
newedge->c /= dy ;
}
newedge->edgenbr = nedges ;
out_bisector(newedge) ;
nedges++ ;
return (newedge) ;
}
Site *
intersect(Halfedge * el1, Halfedge * el2)
{
Edge * e1, * e2, * e ;
Halfedge * el ;
float d, xint, yint ;
int right_of_site ;
Site * v ;
e1 = el1->ELedge ;
e2 = el2->ELedge ;
if ((e1 == (Edge*)NULL) || (e2 == (Edge*)NULL))
{
return ((Site *)NULL) ;
}
if (e1->reg[1] == e2->reg[1])
{
return ((Site *)NULL) ;
}
d = (e1->a * e2->b) - (e1->b * e2->a) ;
if ((-1.0e-10 < d) && (d < 1.0e-10))
{
return ((Site *)NULL) ;
}
xint = (e1->c * e2->b - e2->c * e1->b) / d ;
yint = (e2->c * e1->a - e1->c * e2->a) / d ;
if ((e1->reg[1]->coord.y < e2->reg[1]->coord.y) ||
(e1->reg[1]->coord.y == e2->reg[1]->coord.y &&
e1->reg[1]->coord.x < e2->reg[1]->coord.x))
{
el = el1 ;
e = e1 ;
}
else
{
el = el2 ;
e = e2 ;
}
right_of_site = (xint >= e->reg[1]->coord.x) ;
if ((right_of_site && (el->ELpm == le)) ||
(!right_of_site && (el->ELpm == re)))
{
return ((Site *)NULL) ;
}
v = (Site *)getfree(&sfl) ;
v->refcnt = 0 ;
v->coord.x = xint ;
v->coord.y = yint ;
return (v) ;
}
/*** returns 1 if p is to right of halfedge e ***/
int
right_of(Halfedge * el, Point * p)
{
Edge * e ;
Site * topsite ;
int right_of_site, above, fast ;
float dxp, dyp, dxs, t1, t2, t3, yl ;
e = el->ELedge ;
topsite = e->reg[1] ;
right_of_site = (p->x > topsite->coord.x) ;
if (right_of_site && (el->ELpm == le))
{
return (1) ;
}
if(!right_of_site && (el->ELpm == re))
{
return (0) ;
}
if (e->a == 1.0)
{
dyp = p->y - topsite->coord.y ;
dxp = p->x - topsite->coord.x ;
fast = 0 ;
if ((!right_of_site & (e->b < 0.0)) ||
(right_of_site & (e->b >= 0.0)))
{
fast = above = (dyp >= e->b*dxp) ;
}
else
{
above = ((p->x + p->y * e->b) > (e->c)) ;
if (e->b < 0.0)
{
above = !above ;
}
if (!above)
{
fast = 1 ;
}
}
if (!fast)
{
dxs = topsite->coord.x - (e->reg[0])->coord.x ;
above = (e->b * (dxp*dxp - dyp*dyp))
<
(dxs * dyp * (1.0 + 2.0 * dxp /
dxs + e->b * e->b)) ;
if (e->b < 0.0)
{
above = !above ;
}
}
}
else /*** e->b == 1.0 ***/
{
yl = e->c - e->a * p->x ;
t1 = p->y - yl ;
t2 = p->x - topsite->coord.x ;
t3 = yl - topsite->coord.y ;
above = ((t1*t1) > ((t2 * t2) + (t3 * t3))) ;
}
return (el->ELpm == le ? above : !above) ;
}
void
endpoint(Edge * e, int lr, Site * s)
{
e->ep[lr] = s ;
ref(s) ;
if (e->ep[re-lr] == (Site *)NULL)
{
return ;
}
out_ep(e) ;
deref(e->reg[le]) ;
deref(e->reg[re]) ;
makefree((Freenode *)e, (Freelist *) &efl) ;
}
float
dist(Site * s, Site * t)
{
float dx,dy ;
dx = s->coord.x - t->coord.x ;
dy = s->coord.y - t->coord.y ;
return (sqrt(dx*dx + dy*dy)) ;
}
void
makevertex(Site * v)
{
v->sitenbr = nvertices++ ;
out_vertex(v) ;
}
void
deref(Site * v)
{
if (--(v->refcnt) == 0 )
{
makefree((Freenode *)v, (Freelist *)&sfl) ;
}
}
void
ref(Site * v)
{
++(v->refcnt) ;
}

118
contrib/voronoi/heap.c Normal file
View File

@@ -0,0 +1,118 @@
/*** 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 ;
}
}

161
contrib/voronoi/main.c Normal file
View File

@@ -0,0 +1,161 @@
/*** MAIN.C ***/
#include <stdio.h>
#include <stdlib.h> /* realloc(), qsort() */
#include "vdefs.h"
Site * readone(void), * nextone(void) ;
void readsites(void) ;
int sorted, triangulate, plot, debug, nsites, siteidx ;
float xmin, xmax, ymin, ymax ;
Site * sites ;
Freelist sfl ;
int
main(int argc, char *argv[])
{
int c ;
Site *(*next)() ;
sorted = triangulate = plot = debug = 0 ;
while ((c = getopt(argc, argv, "dpst")) != EOF)
{
switch(c)
{
case 'd':
debug = 1 ;
break ;
case 's':
sorted = 1 ;
break ;
case 't':
triangulate = 1 ;
break ;
case 'p':
plot = 1 ;
break ;
}
}
freeinit(&sfl, sizeof(Site)) ;
if (sorted)
{
scanf("%d %f %f %f %f", &nsites, &xmin, &xmax, &ymin, &ymax) ;
next = readone ;
}
else
{
readsites() ;
next = nextone ;
}
siteidx = 0 ;
geominit() ;
if (plot)
{
plotinit() ;
}
voronoi(next) ;
return (0) ;
}
/*** sort sites on y, then x, coord ***/
int
scomp(const void * vs1, const void * vs2)
{
Point * s1 = (Point *)vs1 ;
Point * s2 = (Point *)vs2 ;
if (s1->y < s2->y)
{
return (-1) ;
}
if (s1->y > s2->y)
{
return (1) ;
}
if (s1->x < s2->x)
{
return (-1) ;
}
if (s1->x > s2->x)
{
return (1) ;
}
return (0) ;
}
/*** return a single in-storage site ***/
Site *
nextone(void)
{
Site * s ;
if (siteidx < nsites)
{
s = &sites[siteidx++];
return (s) ;
}
else
{
return ((Site *)NULL) ;
}
}
/*** read all sites, sort, and compute xmin, xmax, ymin, ymax ***/
void
readsites(void)
{
int i ;
nsites = 0 ;
sites = (Site *) myalloc(4000 * sizeof(Site));
while (scanf("%f %f", &sites[nsites].coord.x,
&sites[nsites].coord.y) !=EOF)
{
sites[nsites].sitenbr = nsites ;
sites[nsites++].refcnt = 0 ;
if (nsites % 4000 == 0)
sites = (Site *)
realloc(sites,(nsites+4000)*sizeof(Site));
}
qsort((void *)sites, nsites, sizeof(Site), scomp) ;
xmin = sites[0].coord.x ;
xmax = sites[0].coord.x ;
for (i = 1 ; i < nsites ; ++i)
{
if(sites[i].coord.x < xmin)
{
xmin = sites[i].coord.x ;
}
if (sites[i].coord.x > xmax)
{
xmax = sites[i].coord.x ;
}
}
ymin = sites[0].coord.y ;
ymax = sites[nsites-1].coord.y ;
}
/*** read one site ***/
Site *
readone(void)
{
Site * s ;
s = (Site *)getfree(&sfl) ;
s->refcnt = 0 ;
s->sitenbr = siteidx++ ;
if (scanf("%f %f", &(s->coord.x), &(s->coord.y)) == EOF)
{
return ((Site *)NULL ) ;
}
return (s) ;
}

57
contrib/voronoi/memory.c Normal file
View File

@@ -0,0 +1,57 @@
/*** MEMORY.C ***/
#include <stdio.h>
#include <stdlib.h> /* malloc(), exit() */
#include "vdefs.h"
extern int sqrt_nsites, siteidx ;
void
freeinit(Freelist * fl, int size)
{
fl->head = (Freenode *)NULL ;
fl->nodesize = size ;
}
char *
getfree(Freelist * fl)
{
int i ;
Freenode * t ;
if (fl->head == (Freenode *)NULL)
{
t = (Freenode *) myalloc(sqrt_nsites * fl->nodesize) ;
for(i = 0 ; i < sqrt_nsites ; i++)
{
makefree((Freenode *)((char *)t+i*fl->nodesize), fl) ;
}
}
t = fl->head ;
fl->head = (fl->head)->nextfree ;
return ((char *)t) ;
}
void
makefree(Freenode * curr, Freelist * fl)
{
curr->nextfree = fl->head ;
fl->head = curr ;
}
int total_alloc ;
char *
myalloc(unsigned n)
{
char * t ;
if ((t=malloc(n)) == (char *) 0)
{
fprintf(stderr,"Insufficient memory processing site %d (%d bytes in use)\n",
siteidx, total_alloc) ;
return(0) ; // was exit(0) in original source, we aint having that here !!!
}
total_alloc += n ;
return (t) ;
}

244
contrib/voronoi/output.c Normal file
View File

@@ -0,0 +1,244 @@
/*** OUTPUT.C ***/
#include <stdio.h>
#include "vdefs.h"
extern int triangulate, plot, debug ;
extern float ymax, ymin, xmax, xmin ;
float pxmin, pxmax, pymin, pymax, cradius;
void
openpl(void)
{
}
#pragma argsused
void
line(float ax, float ay, float bx, float by)
{
}
#pragma argsused
void
circle(float ax, float ay, float radius)
{
}
#pragma argsused
void
range(float pxmin, float pxmax, float pymin, float pymax)
{
}
void
out_bisector(Edge * e)
{
if (triangulate && plot && !debug)
{
line(e->reg[0]->coord.x, e->reg[0]->coord.y,
e->reg[1]->coord.x, e->reg[1]->coord.y) ;
}
if (!triangulate && !plot && !debug)
{
printf("l %f %f %f\n", e->a, e->b, e->c) ;
}
if (debug)
{
printf("line(%d) %gx+%gy=%g, bisecting %d %d\n", e->edgenbr,
e->a, e->b, e->c, e->reg[le]->sitenbr, e->reg[re]->sitenbr) ;
}
}
void
out_ep(Edge * e)
{
if (!triangulate && plot)
{
clip_line(e) ;
}
if (!triangulate && !plot)
{
printf("e %d", e->edgenbr);
printf(" %d ", e->ep[le] != (Site *)NULL ? e->ep[le]->sitenbr : -1) ;
printf("%d\n", e->ep[re] != (Site *)NULL ? e->ep[re]->sitenbr : -1) ;
}
}
void
out_vertex(Site * v)
{
if (!triangulate && !plot && !debug)
{
printf ("v %f %f\n", v->coord.x, v->coord.y) ;
}
if (debug)
{
printf("vertex(%d) at %f %f\n", v->sitenbr, v->coord.x, v->coord.y) ;
}
}
void
out_site(Site * s)
{
if (!triangulate && plot && !debug)
{
circle (s->coord.x, s->coord.y, cradius) ;
}
if (!triangulate && !plot && !debug)
{
printf("s %f %f\n", s->coord.x, s->coord.y) ;
}
if (debug)
{
printf("site (%d) at %f %f\n", s->sitenbr, s->coord.x, s->coord.y) ;
}
}
void
out_triple(Site * s1, Site * s2, Site * s3)
{
if (triangulate && !plot && !debug)
{
printf("%d %d %d\n", s1->sitenbr, s2->sitenbr, s3->sitenbr) ;
}
if (debug)
{
printf("circle through left=%d right=%d bottom=%d\n",
s1->sitenbr, s2->sitenbr, s3->sitenbr) ;
}
}
void
plotinit(void)
{
float dx, dy, d ;
dy = ymax - ymin ;
dx = xmax - xmin ;
d = ( dx > dy ? dx : dy) * 1.1 ;
pxmin = xmin - (d-dx) / 2.0 ;
pxmax = xmax + (d-dx) / 2.0 ;
pymin = ymin - (d-dy) / 2.0 ;
pymax = ymax + (d-dy) / 2.0 ;
cradius = (pxmax - pxmin) / 350.0 ;
openpl() ;
range(pxmin, pymin, pxmax, pymax) ;
}
void
clip_line(Edge * e)
{
Site * s1, * s2 ;
float x1, x2, y1, y2 ;
if (e->a == 1.0 && e->b >= 0.0)
{
s1 = e->ep[1] ;
s2 = e->ep[0] ;
}
else
{
s1 = e->ep[0] ;
s2 = e->ep[1] ;
}
if (e->a == 1.0)
{
y1 = pymin ;
if (s1 != (Site *)NULL && s1->coord.y > pymin)
{
y1 = s1->coord.y ;
}
if (y1 > pymax)
{
return ;
}
x1 = e->c - e->b * y1 ;
y2 = pymax ;
if (s2 != (Site *)NULL && s2->coord.y < pymax)
{
y2 = s2->coord.y ;
}
if (y2 < pymin)
{
return ;
}
x2 = e->c - e->b * y2 ;
if (((x1 > pxmax) && (x2 > pxmax)) || ((x1 < pxmin) && (x2 < pxmin)))
{
return ;
}
if (x1 > pxmax)
{
x1 = pxmax ;
y1 = (e->c - x1) / e->b ;
}
if (x1 < pxmin)
{
x1 = pxmin ;
y1 = (e->c - x1) / e->b ;
}
if (x2 > pxmax)
{
x2 = pxmax ;
y2 = (e->c - x2) / e->b ;
}
if (x2 < pxmin)
{
x2 = pxmin ;
y2 = (e->c - x2) / e->b ;
}
}
else
{
x1 = pxmin ;
if (s1 != (Site *)NULL && s1->coord.x > pxmin)
{
x1 = s1->coord.x ;
}
if (x1 > pxmax)
{
return ;
}
y1 = e->c - e->a * x1 ;
x2 = pxmax ;
if (s2 != (Site *)NULL && s2->coord.x < pxmax)
{
x2 = s2->coord.x ;
}
if (x2 < pxmin)
{
return ;
}
y2 = e->c - e->a * x2 ;
if (((y1 > pymax) && (y2 > pymax)) || ((y1 < pymin) && (y2 <pymin)))
{
return ;
}
if (y1> pymax)
{
y1 = pymax ;
x1 = (e->c - y1) / e->a ;
}
if (y1 < pymin)
{
y1 = pymin ;
x1 = (e->c - y1) / e->a ;
}
if (y2 > pymax)
{
y2 = pymax ;
x2 = (e->c - y2) / e->a ;
}
if (y2 < pymin)
{
y2 = pymin ;
x2 = (e->c - y2) / e->a ;
}
}
line(x1,y1,x2,y2);
}

100
contrib/voronoi/t Normal file
View File

@@ -0,0 +1,100 @@
0.532095 0.894141
0.189043 0.613426
0.550977 0.415724
0.00397384 0.60576
0.89423 0.666812
0.0730728 0.740658
0.64018 0.926186
0.389914 0.553149
0.046918 0.172275
0.820327 0.578957
0.166575 0.597895
0.587999 0.824301
0.184717 0.0608049
0.264707 0.661072
0.564959 0.824897
0.986991 0.654621
0.214221 0.611877
0.997171 0.807318
0.233578 0.380796
0.209772 0.585171
0.631619 0.418295
0.441601 0.474479
0.246242 0.196578
0.243191 0.428592
0.129101 0.460463
0.808454 0.240363
0.23591 0.362678
0.841259 0.0182264
0.825533 0.867529
0.780973 0.282859
0.492706 0.0717757
0.0641069 0.0241644
0.711451 0.621806
0.532239 0.872561
0.264527 0.947361
0.984485 0.373498
0.890788 0.0900603
0.81489 0.765458
0.656357 0.383494
0.161836 0.878997
0.789622 0.367808
0.00529994 0.694075
0.751558 0.0541492
0.315169 0.989785
0.0675723 0.642346
0.144209 0.130059
0.755242 0.723929
0.0258396 0.306045
0.00905612 0.544864
0.0917369 0.0311395
0.000120247 0.760615
0.599014 0.406906
0.0209242 0.0676926
0.402961 0.743223
0.536965 0.776167
0.791622 0.4288
0.0492686 0.546021
0.321031 0.883358
0.45994 0.0493888
0.306635 0.920045
0.290264 0.480864
0.117081 0.709596
0.663268 0.827229
0.25703 0.908703
0.138396 0.712536
0.37325 0.578061
0.792062 0.598336
0.761925 0.679885
0.498106 0.0823257
0.0791993 0.879007
0.389481 0.161374
0.909555 0.33623
0.78771 0.527877
0.87391 0.282804
0.914291 0.579771
0.126212 0.635836
0.962689 0.412397
0.662097 0.205412
0.514842 0.35217
0.573771 0.571652
0.541641 0.302552
0.880047 0.447681
0.854456 0.455932
0.882323 0.00625933
0.0835167 0.817145
0.868329 0.54442
0.211671 0.598359
0.169315 0.4421
0.116072 0.753312
0.900911 0.0493624
0.889781 0.970528
0.209244 0.783234
0.0556217 0.973298
0.787673 0.0775736
0.327654 0.267293
0.571657 0.956988
0.519674 0.443726
0.0206049 0.472568
0.00635056 0.409455
0.414254 0.229849

859
contrib/voronoi/tt Normal file
View File

@@ -0,0 +1,859 @@
s 0.882323 0.006259
s 0.841259 0.018226
l 1.000000 -0.291425 0.858223
s 0.064107 0.024164
l 1.000000 -0.021883 0.472882
s 0.091737 0.031140
l 1.000000 0.252447 0.084903
s 0.900911 0.049362
l 0.431244 1.000000 0.412316
s 0.459940 0.049389
l 1.000000 -0.102110 0.668290
v 0.419582 -2.435700
l 1.000000 0.063725 0.264367
s 0.751558 0.054149
l 1.000000 -0.400473 0.781916
v 0.565847 -1.003264
e 4 0 1
l 1.000000 -0.081723 0.647837
v 0.324966 -0.950947
e 5 2 0
l 1.000000 0.049563 0.277834
s 0.184717 0.060805
l 1.000000 0.319051 0.152894
s 0.020924 0.067693
l -0.992063 1.000000 0.003750
v 0.869151 0.037499
e 0 1 3
l 1.000000 0.521961 0.888724
s 0.492706 0.071776
l 1.000000 0.683235 0.517715
v 0.300812 -0.463619
e 8 4 2
l 1.000000 -0.041479 0.320043
v 0.613461 -0.420642
e 7 1 5
l 1.000000 0.016324 0.606594
s 0.787673 0.077574
l 1.000000 0.648606 0.812334
v 0.793528 0.028994
e 6 5 6
l -0.902924 1.000000 -0.687501
s 0.498106 0.082326
l 0.511849 1.000000 0.330624
s 0.890788 0.090060
l -0.248734 1.000000 -0.153117
v 0.608770 -0.133270
e 14 7 5
l 1.000000 -0.068095 0.617845
v 0.857338 0.060132
e 11 8 3
l 0.689494 1.000000 0.651261
v 0.067141 0.070358
e 2 9 2
l 1.000000 -0.516194 0.030822
v 0.840710 0.071597
e 16 6 10
e 20 10 8
l 1.000000 0.121095 0.849380
s 0.144209 0.130059
l -0.584918 1.000000 -0.000765
v 0.129055 0.074721
e 9 11 4
l 0.530452 1.000000 0.143178
v 0.618791 0.013896
e 19 7 12
l 1.000000 -0.111171 0.617246
v 0.448758 0.100928
e 12 13 7
e 17 13 12
l 1.000000 0.862990 0.535857
s 0.389481 0.161374
l -0.629181 1.000000 -0.161838
v 0.082218 0.099566
e 21 9 14
e 24 14 11
l 1.000000 0.505873 0.132585
s 0.046918 0.172275
l 0.248549 1.000000 0.128415
v 0.321727 0.040586
e 13 4 15
l 1.000000 0.491146 0.341660
v 0.077349 0.109190
e 28 16 14
l 1.000000 -0.433915 0.029970
v 0.437804 0.113620
e 27 15 17
e 26 17 13
l 1.000000 -0.727717 0.355121
s 0.246242 0.196578
l 0.453146 1.000000 0.226335
v 0.218773 0.127199
e 23 11 18
l 1.000000 0.651936 0.301699
s 0.662097 0.205412
l -0.591428 1.000000 -0.288257
v 0.296482 0.091986
e 33 18 19
e 30 19 15
l 1.000000 -0.245771 0.273874
v 0.626385 0.082205
e 25 12 20
l 1.000000 0.750568 0.688085
v 0.722244 0.138898
e 35 20 21
e 15 21 6
l -0.982303 1.000000 -0.570564
s 0.414254 0.229849
l 0.361782 1.000000 0.341000
s 0.808454 0.240363
l 0.127656 1.000000 0.260846
v 0.830634 0.154811
e 22 22 10
l -0.547788 1.000000 -0.300201
v 0.477547 0.168232
e 32 17 23
l -0.568398 1.000000 -0.103205
v 0.749045 0.165226
e 38 21 24
e 40 24 22
l 1.000000 0.238806 0.788502
s 0.327654 0.267293
l -0.583720 1.000000 0.005031
v 0.321189 0.192515
e 36 19 25
l 1.000000 0.868607 0.488409
v 0.355334 0.212446
e 44 25 26
e 39 26 23
l 1.000000 -0.432379 0.263477
s 0.873910 0.282804
l 1.000000 0.648390 1.010790
s 0.780973 0.282859
l -0.646672 1.000000 -0.252308
v 0.889503 0.187059
e 41 22 27
l -0.087567 1.000000 0.109167
v 0.735216 0.223136
e 43 28 24
l 1.000000 0.651494 0.880588
s 0.541641 0.302552
l 0.197683 1.000000 0.295209
v 0.547788 0.186921
e 37 29 20
l 1.000000 -0.806436 0.397049
v 0.520067 0.192401
e 42 23 30
e 51 30 29
l 1.000000 0.570726 0.629875
s 0.025840 0.306045
l -0.157572 1.000000 0.233428
v 0.827441 0.282775
e 48 28 31
e 47 31 27
l 1.000000 -0.000592 0.827274
s 0.909555 0.336230
l 0.667185 1.000000 0.904467
s 0.514842 0.352170
l -0.540107 1.000000 0.042054
s 0.235910 0.362678
l -0.062204 1.000000 0.264632
v 0.245294 0.279890
e 45 32 25
l -0.961829 1.000000 0.043960
s 0.789622 0.367808
l 0.101814 1.000000 0.405288
v 0.138555 0.250245
e 31 16 33
e 34 33 18
l 1.000000 0.121927 0.169067
v 0.463117 0.292187
e 53 34 30
l 0.822328 1.000000 0.673020
s 0.984485 0.373498
l 1.000000 0.497371 1.123519
v 1.008234 0.231789
l 1.000000 0.820204 1.198348
v 0.137955 0.255166
e 61 36 33
l 1.000000 -0.496669 0.011222
v 1.034507 0.199756
e 64 35 37
e 49 27 37
l 0.330573 1.000000 0.541737
s 0.233578 0.380796
l -0.128712 1.000000 0.341523
v 0.827464 0.321040
e 55 31 38
l -0.991577 1.000000 -0.499454
s 0.656357 0.383494
l -0.032232 1.000000 0.273205
v 0.633847 0.293635
e 52 29 39
l 1.000000 0.705586 0.841031
v 0.688146 0.295385
e 69 39 40
e 50 40 28
l 1.000000 -0.807561 0.449605
v 0.147205 0.273789
e 65 36 41
e 58 41 32
l 1.000000 0.269591 0.221015
v 0.846367 0.339784
e 68 38 42
e 56 42 35
l 1.000000 -0.263297 0.756903
s 0.599014 0.406906
l 0.549792 1.000000 0.668290
v 0.603676 0.336394
e 70 43 39
l 1.000000 -0.408280 0.466333
s 0.006351 0.409455
l -0.188464 1.000000 0.354717
v 0.574582 0.352390
e 57 34 44
e 74 44 43
l 1.000000 0.650288 0.803737
v 0.717875 0.332198
e 71 40 45
e 60 45 38
l 1.000000 -0.117705 0.678773
s 0.962689 0.412397
l -0.560323 1.000000 -0.152575
s 0.550977 0.415724
l 0.568572 1.000000 0.686944
v 0.566469 0.364866
e 77 46 44
l 1.000000 -0.183567 0.499492
s 0.631619 0.418295
l -0.710842 1.000000 -0.056879
v 0.624295 0.386896
e 75 43 47
l 1.000000 0.349302 0.759439
v 0.937997 0.373006
e 63 48 35
l 0.697598 1.000000 1.027351
s 0.243191 0.428592
l 0.201126 1.000000 0.452639
s 0.791622 0.428800
l 0.032791 1.000000 0.424229
s 0.169315 0.442100
l 1.000000 -0.953955 -0.191056
v 0.409040 0.336655
e 46 26 49
e 62 49 34
l 1.000000 0.453432 0.561690
v 0.153601 0.361293
l -0.838496 1.000000 0.232499
s 0.519674 0.443726
l 1.000000 -0.894547 0.150916
v 0.507367 0.398470
e 80 51 46
l 0.052777 1.000000 0.425247
s 0.880047 0.447681
l -0.264762 1.000000 0.155046
v 0.129143 0.340785
e 72 52 41
e 89 52 50
l 1.000000 0.948281 0.452303
v 0.857504 0.382081
e 73 42 53
l 1.000000 0.883306 1.194998
v 0.906422 0.395032
e 92 53 54
e 84 54 48
l 1.000000 -0.426950 0.737763
s 0.854456 0.455932
l 1.000000 -0.322417 0.721581
v 0.848176 0.392641
e 94 55 53
l 0.735713 1.000000 1.016655
v 0.201987 0.412015
e 87 50 56
l 1.000000 -0.182847 0.126651
v 0.842804 0.396593
e 97 57 55
l 1.000000 0.431804 1.014055
v 1.199456 0.145229
e 66 37 58
e 18 8 58
l 0.257837 1.000000 0.454492
s 0.129101 0.460463
l 1.000000 -0.456632 -0.056862
v 0.108630 0.362417
e 93 59 52
l 0.668714 1.000000 0.435059
v 0.093729 0.372381
e 102 60 59
l 1.000000 0.415542 0.248470
v 0.725906 0.400426
e 78 45 61
e 86 61 57
l 1.000000 0.334943 0.860025
s 0.020605 0.472568
l 0.225854 1.000000 0.444055
s 0.441601 0.474479
l -0.598819 1.000000 0.126956
v 0.457785 0.401087
e 91 62 51
l 1.000000 -0.393900 0.299797
s 0.290264 0.480864
l 0.900540 1.000000 0.694927
v 0.396472 0.364372
e 88 63 49
e 106 63 62
l 0.549975 1.000000 0.582421
v 0.336883 0.384883
e 85 56 64
e 67 50 64
l 0.110462 1.000000 0.422096
v 0.070569 0.428117
e 103 65 60
l 1.000000 -0.111571 0.022803
v 0.345321 0.383951
e 110 64 66
l 0.459902 1.000000 0.542765
v 0.350844 0.381411
e 112 66 67
e 59 32 67
l -0.175071 1.000000 0.319989
v -0.258576 0.192683
e 29 68 16
e 54 68 36
l 0.020622 1.000000 0.187351
v 0.361953 0.383356
e 113 67 69
e 109 69 63
l 1.000000 -0.042191 0.345779
s 0.787710 0.527877
l -0.039484 1.000000 0.447159
v 0.710026 0.447837
e 82 47 70
e 104 70 61
l 1.000000 0.065655 0.739428
v 0.807207 0.479031
e 99 71 57
l -0.927737 1.000000 -0.269844
s 0.868329 0.544420
l 0.156778 1.000000 0.635223
s 0.009056 0.544864
l -0.159743 1.000000 0.506347
s 0.049269 0.546021
l 0.390232 1.000000 0.522928
v 0.881814 0.496974
e 96 55 72
l -0.121130 1.000000 0.390160
v 0.030149 0.511163
l 1.000000 0.028772 0.044856
v 0.077761 0.492583
e 121 73 74
e 111 65 74
l -0.933079 1.000000 0.420026
s 0.389914 0.553149
l -0.657010 1.000000 0.240657
v 0.834537 0.504386
e 118 71 75
e 119 75 72
l 1.000000 0.205200 0.938037
v 0.366080 0.481176
e 115 69 76
l 1.000000 0.725389 0.715120
v 0.589040 0.487825
e 81 46 77
e 83 77 47
l 1.000000 0.031881 0.604593
v 0.708234 0.475123
e 117 78 70
e 116 78 71
l 1.000000 0.702039 1.041789
s 0.573771 0.571652
l 0.422877 1.000000 0.738886
v 0.588980 0.489705
e 90 51 79
e 128 79 77
l 1.000000 -0.227174 0.477732
v 0.589004 0.489809
e 131 79 80
l -0.377211 1.000000 0.267630
v 0.217846 0.498748
e 98 56 81
e 108 81 66
l 1.000000 0.320499 0.377694
s 0.373250 0.578061
l -0.668914 1.000000 0.310359
s 0.820327 0.578957
l 0.638546 1.000000 1.066820
v 0.827561 0.538384
e 126 82 75
l 1.000000 -0.719491 0.440198
s 0.914291 0.579771
l 1.000000 0.769134 1.323637
v 0.936319 0.503577
e 122 72 83
l 0.259248 1.000000 0.746315
s 0.209772 0.585171
l 0.282776 1.000000 0.567234
v 0.215419 0.506318
e 133 84 81
l -0.771684 1.000000 0.340083
v 0.951126 0.499738
e 138 83 85
e 95 54 85
l -0.289161 1.000000 0.224710
v 0.179037 0.516606
e 101 59 86
e 139 86 84
l 0.646879 1.000000 0.632422
v 0.329909 0.531040
e 127 87 76
l 0.853792 1.000000 0.812714
s 0.166575 0.597895
l 0.272673 1.000000 0.569490
v 0.168173 0.523634
e 142 88 86
l 1.000000 -0.294558 0.013932
s 0.792062 0.598336
l 1.000000 -0.685617 0.402609
s 0.211671 0.598359
l 0.143994 1.000000 0.622108
v 0.788733 0.563178
e 135 89 82
l 0.061766 1.000000 0.611895
s 0.003974 0.605760
l -0.083458 1.000000 0.574768
v 0.506479 0.524707
e 107 62 90
e 130 90 80
l 1.000000 0.735212 0.892250
v 0.123960 0.535690
e 124 74 91
e 144 91 88
l 1.000000 0.442210 0.360847
s 0.214221 0.611877
l 0.188637 1.000000 0.645288
s 0.189043 0.613426
l -0.733639 1.000000 0.453005
v 0.187995 0.590926
e 145 88 92
l 1.000000 0.691250 0.596472
v 0.192680 0.594363
e 153 92 93
l 1.000000 -0.665858 -0.203082
v 0.028251 0.577126
e 123 94 73
l -0.758211 1.000000 0.555706
v 0.201304 0.607314
e 155 93 95
l 1.000000 -0.061522 0.163940
s 0.711451 0.621806
l -0.811879 1.000000 -0.033727
v 0.678654 0.517258
e 129 96 78
l 0.392274 1.000000 0.783476
v 0.738998 0.566250
e 158 96 97
e 148 97 89
l 1.000000 -0.291152 0.574133
v 0.670378 0.520504
e 132 80 98
e 159 98 96
l 1.000000 0.364280 0.859987
s 0.126212 0.635836
l 1.000000 -0.939994 -0.433456
v 0.106725 0.574665
e 151 99 91
l 0.856687 1.000000 0.666095
s 0.067572 0.642346
l 0.190020 1.000000 0.605285
v 0.867187 0.593460
e 136 82 100
e 137 100 83
l 1.000000 0.008662 0.872328
v 0.052285 0.595349
e 156 94 101
l 1.000000 0.575266 0.394770
v 0.091215 0.587952
e 164 101 102
e 163 102 99
l 1.000000 -0.111017 0.025942
v 0.290765 0.564461
e 140 84 103
e 143 103 87
l 1.000000 -0.043492 0.266215
v 0.482330 0.557553
e 125 76 104
e 150 104 90
l 1.000000 0.100638 0.538441
s 0.986991 0.654621
l 0.971275 1.000000 1.540530
s 0.264707 0.661072
l 1.000000 0.974428 0.859663
v 0.291447 0.580141
e 147 93 105
e 168 103 105
l 1.000000 -0.125623 0.218568
v -0.161545 0.480541
e 105 106 65
e 120 106 73
l 0.019981 1.000000 0.477313
v 0.282872 0.591927
e 152 95 107
l 0.845694 1.000000 0.831150
v 0.160033 0.631376
e 162 99 108
e 154 108 92
l 1.000000 -0.356671 -0.065160
v 0.291962 0.584240
e 174 107 109
e 172 105 109
l 1.000000 -0.764775 -0.154851
v 1.043941 0.526576
e 141 85 110
l 0.100329 1.000000 0.631313
s 0.894230 0.666812
l -0.230478 1.000000 0.414880
v 0.867003 0.614704
e 165 111 100
l 0.841193 1.000000 1.344021
s 0.761925 0.679885
l -0.369557 1.000000 0.351967
v 0.758188 0.632161
e 160 97 112
l 0.869057 1.000000 1.291070
v 0.936674 0.630762
e 178 111 113
e 170 113 110
l 1.000000 -0.131424 0.853777
s 0.005300 0.694075
l 0.015016 1.000000 0.649987
v 0.021036 0.649671
e 166 114 101
l 1.000000 -0.830689 -0.518639
v 0.839768 0.637614
e 146 89 115
e 179 115 111
l 1.000000 0.670229 1.267116
s 0.117081 0.709596
l -0.123793 1.000000 0.657657
s 0.138396 0.712536
l 0.158853 1.000000 0.695203
v 0.132837 0.674101
l 1.000000 0.137931 0.225817
v 0.100332 0.670078
e 167 102 117
e 186 117 116
l 0.736189 1.000000 0.743941
s 0.755242 0.723929
l -0.151735 1.000000 0.586804
v 0.172997 0.667722
e 187 116 118
e 175 108 118
l -0.511018 1.000000 0.579317
v 0.826502 0.657407
e 180 112 119
e 185 119 115
l 1.000000 -0.098810 0.761544
v 0.205257 0.671579
e 157 95 120
e 171 120 107
l 1.000000 0.629705 0.628154
s 0.073073 0.740658
l 1.000000 -0.705823 -0.416734
v 0.071305 0.691447
e 189 121 117
l 0.055949 1.000000 0.695436
v 0.475217 0.628239
e 134 87 122
e 169 122 104
l 1.000000 -0.031962 0.455137
s 0.402961 0.743223
l 0.179890 1.000000 0.730458
v 0.056430 0.692279
e 184 114 123
e 195 123 121
l 1.000000 0.687340 0.532261
v 0.199241 0.681133
e 191 118 124
e 193 124 120
l 1.000000 -0.407438 -0.078279
s 0.116072 0.753312
l -0.023081 1.000000 0.728763
v 0.124900 0.731646
e 188 125 116
l -0.547479 1.000000 0.663266
v 0.354953 0.666606
e 176 109 126
l 1.000000 0.594203 0.751052
v 1.186539 0.512269
e 177 110 127
e 79 48 127
l 0.008914 1.000000 0.522847
v 0.099261 0.731054
e 194 121 128
e 200 128 125
l 1.000000 0.294285 0.314399
s 0.000120 0.760615
l -0.077843 1.000000 0.727134
v 0.689921 0.691489
e 181 129 112
l 0.428807 1.000000 0.987331
s 0.814890 0.765458
l 0.618946 1.000000 1.210653
v 0.809479 0.709630
e 190 129 130
l 1.000000 0.696234 1.303547
v 0.830384 0.696690
e 207 130 131
e 192 119 131
l -0.804290 1.000000 0.028821
v 0.475748 0.644876
e 197 126 132
e 196 122 132
l -0.995565 1.000000 0.171238
v 0.030824 0.729533
e 198 133 123
l 1.000000 -0.273561 -0.168749
s 0.536965 0.776167
l -0.179967 1.000000 0.573961
s 0.209244 0.783234
l 1.000000 0.997883 0.920122
v 0.211183 0.710443
e 199 124 134
l -0.454012 1.000000 0.614563
v 0.493778 0.662825
e 210 132 135
l 1.000000 0.245843 0.656729
v 0.610858 0.683896
e 212 135 136
e 161 136 98
l 1.000000 -0.884661 0.005842
v 0.167016 0.754704
e 201 125 137
e 213 137 134
l 1.000000 0.321148 0.409387
s 0.997171 0.807318
l 0.066668 1.000000 0.797109
s 0.083517 0.817145
l 0.136545 1.000000 0.789592
v 0.085468 0.777922
e 204 138 128
l -0.510007 1.000000 0.734333
v 0.950210 0.733761
e 182 113 139
l 0.732645 1.000000 1.429928
s 0.587999 0.824301
l 1.000000 0.943176 1.317244
s 0.564959 0.824897
l 0.574471 1.000000 1.117044
v 0.575492 0.786441
l 1.000000 -0.025867 0.555149
s 0.663268 0.827229
l -0.890357 1.000000 0.144088
v 0.639225 0.713227
e 206 141 129
l -0.234555 1.000000 0.563294
v 0.636173 0.712511
e 216 136 142
e 226 142 141
l 1.000000 0.404282 0.924229
v 0.629386 0.729299
e 222 140 143
e 227 143 142
l 1.000000 0.038901 0.657756
v 0.045552 0.783372
e 211 133 144
e 219 144 138
l 1.000000 0.677847 0.576558
v 0.303894 0.752535
e 214 134 145
e 202 145 126
l 1.000000 -0.206544 0.148463
v 0.911624 0.762031
e 209 131 146
e 221 146 139
l 1.000000 0.229645 1.086621
s 0.825533 0.867529
l 0.104270 1.000000 0.902017
s 0.532239 0.872561
l -0.686472 1.000000 0.472131
v 0.149132 0.810391
e 220 138 147
e 217 147 137
l 1.000000 -0.269719 -0.069446
v 0.511453 0.823229
e 223 148 140
l -0.049028 1.000000 0.798154
s 0.161836 0.878997
l -0.495055 1.000000 0.739263
s 0.079199 0.879007
l -0.069791 1.000000 0.842398
v 0.149972 0.813508
e 234 147 149
l 1.000000 0.789742 0.792434
s 0.321031 0.883358
l -0.584650 1.000000 0.601649
v 0.310186 0.783000
e 230 145 150
l 1.000000 0.895668 1.011494
v 0.742780 0.805428
e 225 141 151
e 208 151 130
l 1.000000 -0.407402 0.414647
s 0.532095 0.894141
l -0.006673 1.000000 0.879800
v 0.120514 0.850809
e 238 152 149
l 1.000000 -0.000120 0.120412
v 0.901053 0.808064
e 231 153 146
l 1.000000 -0.350802 0.617582
s 0.257030 0.908703
l 0.380859 1.000000 0.934761
v 0.264479 0.834032
e 240 154 150
l 1.000000 -0.396010 -0.065806
v 0.750260 0.823787
e 241 151 155
e 232 155 153
l 1.000000 0.248359 0.954855
v 0.455024 0.820463
e 215 156 135
e 235 156 148
l 0.999537 1.000000 1.275275
v 0.577619 0.868650
e 233 148 157
e 224 140 157
l 1.000000 -0.865495 -0.174194
v 0.223193 0.849756
e 236 149 158
e 245 158 154
l 1.000000 0.312057 0.488366
s 0.306635 0.920045
l -0.392401 1.000000 0.778553
v 0.005291 0.842767
e 229 159 144
e 237 159 152
l 0.667943 1.000000 0.846301
v 0.287126 0.891222
e 246 154 160
l 1.000000 0.228646 0.490901
s 0.640180 0.926186
l -0.233314 1.000000 0.724651
v 0.623904 0.870217
e 228 161 143
l 0.512156 1.000000 1.189753
v 0.590680 0.883741
e 249 157 162
l -0.800458 1.000000 0.410927
s 0.264527 0.947361
l 0.193931 1.000000 0.978605
v 0.593340 0.885871
e 256 162 163
e 255 163 161
l 1.000000 0.296480 0.855983
v 0.279542 0.924393
e 253 164 160
l 1.000000 -0.648712 -0.320124
s 0.571657 0.956988
l 0.629497 1.000000 1.272969
v 0.588385 0.902582
e 258 165 163
l 1.000000 -0.449513 0.182663
v 0.425219 0.850254
e 239 150 166
e 248 166 156
l 1.000000 -0.051120 0.381753
s 0.889781 0.970528
l 0.623773 1.000000 1.454012
s 0.055622 0.973298
l -0.250051 1.000000 0.909296
v 0.925199 0.876897
e 244 153 167
l -0.657986 1.000000 0.268129
v 0.426875 0.882648
e 262 166 168
e 242 168 162
l 1.000000 0.051089 0.471968
s 0.315169 0.989785
l 0.122369 1.000000 0.992960
v 0.732439 0.895540
e 254 161 169
e 247 169 155
l 1.000000 -0.316461 0.449036
v 0.300192 0.956226
e 259 164 170
l 1.000000 0.837724 1.101245
v 0.194772 0.940833
e 250 171 158
e 257 171 164
l 1.000000 0.665725 0.821108
v 0.120525 0.939434
e 243 152 172
l 1.000000 -0.887837 -0.713539
v -0.800463 0.203858
e 114 173 68
e 76 173 60
l -0.042643 1.000000 0.237992
v -0.068622 0.892137
e 252 174 159
e 264 174 172
l 0.260959 1.000000 0.874230
v 0.416510 0.941992
e 267 170 175
e 251 160 175
l -0.055080 1.000000 0.919051
v 0.423822 0.942395
e 274 175 176
e 266 176 168
l 1.000000 -0.440906 0.008315
v 0.163488 0.987825
e 271 172 177
e 270 177 171
l 1.000000 -0.124157 0.040843
v 0.759290 0.980387
e 268 169 178
e 263 178 167
l 1.000000 0.177651 0.933457
v 0.445834 0.992318
e 275 176 179
e 260 179 165
l 1.000000 -0.127870 0.318946
v 0.177717 1.102425
e 276 177 180
e 269 180 170
l 1.000000 0.063522 0.247745
v -0.942148 0.496138
e 173 181 106
e 149 181 94
l -0.012107 1.000000 0.507545
v 0.720786 1.197126
e 261 165 182
e 277 182 178
l 1.000000 0.042562 0.771739
v -0.830797 0.662462
e 183 183 114
e 205 183 133
l -0.024885 1.000000 0.683137
v 4.748839 0.480514
e 218 139 184
e 203 127 184
l 0.029243 1.000000 0.619382
v 0.658662 2.656735
e 278 179 185
e 281 185 182
l 1.000000 -0.033513 0.569627
v -13.741838 0.341169
e 280 186 181
e 282 186 183
l -0.017742 1.000000 0.584978
e 1 -1 0
e 10 -1 9
e 272 -1 173
e 285 -1 186
e 273 -1 174
e 279 -1 180
e 284 185 -1
e 265 167 -1
e 283 184 -1
e 100 58 -1
e 3 3 -1

135
contrib/voronoi/vdefs.h Normal file
View File

@@ -0,0 +1,135 @@
#ifndef __VDEFS_H
#define __VDEFS_H
#ifndef NULL
#define NULL 0
#endif
#define DELETED -2
typedef struct tagFreenode
{
struct tagFreenode * nextfree;
} Freenode ;
typedef struct tagFreelist
{
Freenode * head;
int nodesize;
} Freelist ;
typedef struct tagPoint
{
float x ;
float y ;
} Point ;
/* structure used both for sites and for vertices */
typedef struct tagSite
{
Point coord ;
int sitenbr ;
int refcnt ;
} Site ;
typedef struct tagEdge
{
float a, b, c ;
Site * ep[2] ;
Site * reg[2] ;
int edgenbr ;
} Edge ;
#define le 0
#define re 1
typedef struct tagHalfedge
{
struct tagHalfedge * ELleft ;
struct tagHalfedge * ELright ;
Edge * ELedge ;
int ELrefcnt ;
char ELpm ;
Site * vertex ;
float ystar ;
struct tagHalfedge * PQnext ;
} Halfedge ;
/* edgelist.c */
void ELinitialize(void) ;
Halfedge * HEcreate(Edge *, int) ;
void ELinsert(Halfedge *, Halfedge *) ;
Halfedge * ELgethash(int) ;
Halfedge * ELleftbnd(Point *) ;
void ELdelete(Halfedge *) ;
Halfedge * ELright(Halfedge *) ;
Halfedge * ELleft(Halfedge *) ;
Site * leftreg(Halfedge *) ;
Site * rightreg(Halfedge *) ;
extern int ELhashsize ;
extern Site * bottomsite ;
extern Freelist hfl ;
extern Halfedge * ELleftend, * ELrightend, **ELhash ;
/* geometry.c */
void geominit(void) ;
Edge * bisect(Site *, Site *) ;
Site * intersect(Halfedge *, Halfedge *) ;
int right_of(Halfedge *, Point *) ;
void endpoint(Edge *, int, Site *) ;
float dist(Site *, Site *) ;
void makevertex(Site *) ;
void deref(Site *) ;
void ref(Site *) ;
extern float deltax, deltay ;
extern int nsites, nedges, sqrt_nsites, nvertices ;
extern Freelist sfl, efl ;
/* heap.c */
void PQinsert(Halfedge *, Site *, float) ;
void PQdelete(Halfedge *) ;
int PQbucket(Halfedge *) ;
int PQempty(void) ;
Point PQ_min(void) ;
Halfedge * PQextractmin(void) ;
void PQinitialize(void) ;
extern int PQmin, PQcount, PQhashsize ;
extern Halfedge * PQhash ;
/* main.c */
extern int sorted, triangulate, plot, debug, nsites, siteidx ;
extern float xmin, xmax, ymin, ymax ;
extern Site * sites ;
extern Freelist sfl ;
/* getopt.c */
extern int getopt(int, char *const *, const char *);
/* memory.c */
void freeinit(Freelist *, int) ;
char *getfree(Freelist *) ;
void makefree(Freenode *, Freelist *) ;
char *myalloc(unsigned) ;
/* output.c */
void openpl(void) ;
void line(float, float, float, float) ;
void circle(float, float, float) ;
void range(float, float, float, float) ;
void out_bisector(Edge *) ;
void out_ep(Edge *) ;
void out_vertex(Site *) ;
void out_site(Site *) ;
void out_triple(Site *, Site *, Site *) ;
void plotinit(void) ;
void clip_line(Edge *) ;
/* voronoi.c */
void voronoi(Site *(*)()) ;
#endif

BIN
contrib/voronoi/voronoi Executable file

Binary file not shown.

120
contrib/voronoi/voronoi.c Normal file
View File

@@ -0,0 +1,120 @@
/*** VORONOI.C ***/
#include "vdefs.h"
extern Site * bottomsite ;
extern Halfedge * ELleftend, * ELrightend ;
/*** implicit parameters: nsites, sqrt_nsites, xmin, xmax, ymin, ymax,
: deltax, deltay (can all be estimates).
: Performance suffers if they are wrong; better to make nsites,
: deltax, and deltay too big than too small. (?)
***/
void
voronoi(Site *(*nextsite)(void))
{
Site * newsite, * bot, * top, * temp, * p, * v ;
Point newintstar ;
int pm ;
Halfedge * lbnd, * rbnd, * llbnd, * rrbnd, * bisector ;
Edge * e ;
PQinitialize() ;
bottomsite = (*nextsite)() ;
out_site(bottomsite) ;
ELinitialize() ;
newsite = (*nextsite)() ;
while (1)
{
if(!PQempty())
{
newintstar = PQ_min() ;
}
if (newsite != (Site *)NULL && (PQempty()
|| newsite -> coord.y < newintstar.y
|| (newsite->coord.y == newintstar.y
&& newsite->coord.x < newintstar.x))) {/* new site is
smallest */
{
out_site(newsite) ;
}
lbnd = ELleftbnd(&(newsite->coord)) ;
rbnd = ELright(lbnd) ;
bot = rightreg(lbnd) ;
e = bisect(bot, newsite) ;
bisector = HEcreate(e, le) ;
ELinsert(lbnd, bisector) ;
p = intersect(lbnd, bisector) ;
if (p != (Site *)NULL)
{
PQdelete(lbnd) ;
PQinsert(lbnd, p, dist(p,newsite)) ;
}
lbnd = bisector ;
bisector = HEcreate(e, re) ;
ELinsert(lbnd, bisector) ;
p = intersect(bisector, rbnd) ;
if (p != (Site *)NULL)
{
PQinsert(bisector, p, dist(p,newsite)) ;
}
newsite = (*nextsite)() ;
}
else if (!PQempty()) /* intersection is smallest */
{
lbnd = PQextractmin() ;
llbnd = ELleft(lbnd) ;
rbnd = ELright(lbnd) ;
rrbnd = ELright(rbnd) ;
bot = leftreg(lbnd) ;
top = rightreg(rbnd) ;
out_triple(bot, top, rightreg(lbnd)) ;
v = lbnd->vertex ;
makevertex(v) ;
endpoint(lbnd->ELedge, lbnd->ELpm, v);
endpoint(rbnd->ELedge, rbnd->ELpm, v) ;
ELdelete(lbnd) ;
PQdelete(rbnd) ;
ELdelete(rbnd) ;
pm = le ;
if (bot->coord.y > top->coord.y)
{
temp = bot ;
bot = top ;
top = temp ;
pm = re ;
}
e = bisect(bot, top) ;
bisector = HEcreate(e, pm) ;
ELinsert(llbnd, bisector) ;
endpoint(e, re-pm, v) ;
deref(v) ;
p = intersect(llbnd, bisector) ;
if (p != (Site *) NULL)
{
PQdelete(llbnd) ;
PQinsert(llbnd, p, dist(p,bot)) ;
}
p = intersect(bisector, rrbnd) ;
if (p != (Site *) NULL)
{
PQinsert(bisector, p, dist(p,bot)) ;
}
}
else
{
break ;
}
}
for( lbnd = ELright(ELleftend) ;
lbnd != ELrightend ;
lbnd = ELright(lbnd))
{
e = lbnd->ELedge ;
out_ep(e) ;
}
}

View File

@@ -756,6 +756,7 @@ HEADERS += ../contrib/qtsolutions/codeeditor/codeeditor.h ../contrib/qtsolutions
../contrib/boost/GeometricTools_BSplineCurve.h \
../contrib/kmeans/kmeans_dataset.h ../contrib/kmeans/kmeans_general_functions.h ../contrib/kmeans/hamerly_kmeans.h \
../contrib/kmeans/kmeans.h ../contrib/kmeans/original_space_kmeans.h ../contrib/kmeans/triangle_inequality_base_kmeans.h
../contrib/voronoi/vdefs.h
# Train View
@@ -865,7 +866,9 @@ SOURCES += ../contrib/qtsolutions/codeeditor/codeeditor.cpp ../contrib/qtsolutio
../contrib/levmar/Axb_core.c ../contrib/levmar/lm.c ../contrib/levmar/lmbc.c ../contrib/levmar/lmblec.c ../contrib/levmar/lmbleic.c \
../contrib/levmar/lmlec_core.c ../contrib/levmar/misc_core.c \
../contrib/kmeans/kmeans_dataset.cpp ../contrib/kmeans/kmeans_general_functions.cpp ../contrib/kmeans/hamerly_kmeans.cpp \
../contrib/kmeans/kmeans.cpp ../contrib/kmeans/original_space_kmeans.cpp ../contrib/kmeans/triangle_inequality_base_kmeans.cpp
../contrib/kmeans/kmeans.cpp ../contrib/kmeans/original_space_kmeans.cpp ../contrib/kmeans/triangle_inequality_base_kmeans.cpp \
../contrib/voronoi/edgelist.c ../contrib/voronoi/geometry.c ../contrib/voronoi/heap.c \
../contrib/voronoi/memory.c ../contrib/voronoi/output.c ../contrib/voronoi/voronoi.c
## Train View Components