blob: 08ab7f53f8b11e4a1b21b12154bc295bda536bc4 [file] [log] [blame]
/* For copyright information, see olden_v1.0/COPYRIGHT */
#include "defines.h"
#include <stdio.h>
extern struct VEC2 V2_sum();
extern struct VEC2 V2_sub();
extern struct VEC2 V2_times();
extern double V2_cprod();
extern struct VEC2 V2_cross();
extern double V2_dot();
extern double V2_magn();
/****************************************************************/
/* Voronoi Output Routines */
/****************************************************************/
void plot_dedge(p1, p2)
VERTEX_PTR p1, p2;
{
double x1,x2,y1,y2;
x1=X(p1);
y1=Y(p1);
x2=X(p2);
y2=Y(p2);
/* plots a Delaunay-triangulation edge on your favorite device. */
printf("Dedge %g %g %g %g \n",(float) x1, (float) y1,
(float) x2, (float) y2);
}
void plot_vedge(p1, p2)
struct VEC2 p1, p2;
{
/* plots a Voronoi-diagram edge on your favorite device. */
printf("Vedge %g %g %g %g \n",(float) p1.x, (float) p1.y, (float) p2.x,
(float) p2.y);
}
struct VEC2 circle_center(struct VEC2 a, struct VEC2 b, struct VEC2 c)
/* returns the center of the circle passing through A, B & C. */
{
struct VEC2 p;
double d1,d2,d3,d4;
struct VEC2 vv1, vv2, vv3, vv4, vv5, vv6, vv7 ;
vv1 = V2_sub(b,c);
d1 = V2_magn( vv1 );
vv1 = V2_sum(a,b);
vv2 = V2_times(0.5, vv1);
if (d1 < 0.0) /*there is no intersection point, the bisectors coincide. */
return(vv2);
else {
vv3 = V2_sub(b,a);
vv4 = V2_sub(c,a);
d3 = V2_cprod(vv3, vv4) ;
d2 = -2.0 * d3 ;
vv5 = V2_sub(c,b);
d4 = V2_dot(vv5, vv4);
vv6 = V2_cross(vv3);
vv7 = V2_times(d4/ d2 , vv6);
p = V2_sum(vv2, vv7);
return(p);
}
}
int *earray;
void output_voronoi_diagram(QUAD_EDGE edge, int nv, struct EDGE_STACK *my_stack)
{
QUAD_EDGE nex, prev, snex, sprev;
struct VEC2 cvxvec, center;
double ln;
double d1;
struct VEC2 vv1, vv2, vv3;
if (voronoi) {
zero_seen(my_stack,edge);
nex = edge;
/* Plot VD edges with one endpoint at infinity. */
do {
struct VEC2 v21,v22,v23;
QUAD_EDGE tmp;
v21=destv(nex);
v22=origv(nex);
tmp=onext(nex);
v23=destv(tmp);
cvxvec = V2_sub(v21,v22/*destv(nex), origv(nex)*/);
center = circle_center(v22,v21,v23
/*origv(nex), destv(nex), destv(onext(nex))*/);
vv1 = V2_sum(v22,v21/*origv(nex), destv(nex)*/) ;
vv2 = V2_times(0.5, vv1);
vv3 = V2_sub(center, vv2) ;
ln = 1.0 + V2_magn(vv3);
d1 = ln/V2_magn(cvxvec);
vv1 = V2_cross(cvxvec);
vv2 = V2_times(d1, vv1) ;
vv3 = V2_sum(center, vv2);
plot_vedge( center, vv3 ) ;
nex = rnext(nex);
} while (nex != edge);
}
/* Plot DT edges and finite VD edges. */
my_stack->ptr = 0;
push_ring(my_stack, edge);
printf("mystack_ptr = %d\n",my_stack->ptr);
while (my_stack->ptr != 0) {
VERTEX_PTR v1,v2,v3,v4;
double d1,d2;
edge = pop_edge(my_stack);
if (seen(edge) == 1) {
prev = edge;
nex = onext(edge);
do {
v1=orig(prev);
d1=X(v1);
v2=dest(prev);
d2=X(v2);
if (d1 >= d2 /*X(orig(prev)) >= X(dest(prev))*/) {
/*plot_dedge(orig(prev), dest(prev));*/
plot_dedge(v1,v2);
sprev = sym(prev);
snex = onext(sprev);
v1=orig(prev);
v2=dest(prev);
v3=dest(nex);
v4=dest(snex);
if (ccw(v1,v2,v3/*orig(prev), dest(prev), dest(nex)*/)
!= ccw(v1,v2,v4/*orig(prev),dest(prev),dest(snex)*/)) {
struct VEC2 v21, v22, v23;
v21 = origv(prev);
v22 = destv(prev);
v23 = destv(nex);
vv1 = circle_center(v21,v22,v23/*origv(prev),
destv(prev),destv(nex)*/);
v21 = origv(sprev);
v22 = destv(sprev);
v23 = destv(snex);
vv2 = circle_center(v21,v22,v23/*origv(sprev),
destv(sprev),destv(snex)*/);
plot_vedge( vv1 , vv2 );
}
}
seen(prev) = 2;
prev = nex;
nex = onext(nex);
} while (prev != edge);
}
push_ring(my_stack, sym(edge));
}
zero_seen(my_stack, edge);
}