Graphviz 12.0.1~dev.20240716.0800
Loading...
Searching...
No Matches
voronoi.c
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (c) 2011 AT&T Intellectual Property
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#include <neatogen/mem.h>
12#include <neatogen/geometry.h>
13#include <neatogen/edges.h>
14#include <neatogen/hedges.h>
15#include <neatogen/heap.h>
16#include <neatogen/voronoi.h>
17
18void voronoi(Site *(*nextsite)(void *context), void *context) {
19 Site *newsite, *bot, *top, *temp, *p;
20 Site *v;
21 Point newintstar = {0};
22 char pm;
23 Halfedge *lbnd, *rbnd, *llbnd, *rrbnd, *bisector;
24 Edge *e;
25
26 edgeinit();
27 siteinit();
29 bottomsite = nextsite(context);
31
32 newsite = nextsite(context);
33 while (1) {
34 if (!PQempty())
35 newintstar = PQ_min();
36
37 if (newsite != NULL &&
38 (PQempty() || newsite->coord.y < newintstar.y ||
39 (newsite->coord.y ==newintstar.y && newsite->coord.x < newintstar.x))) {
40 /* new site is smallest */
41 lbnd = ELleftbnd(&newsite->coord);
42 rbnd = ELright(lbnd);
43 bot = rightreg(lbnd);
44 e = gvbisect(bot, newsite);
45 bisector = HEcreate(e, le);
46 ELinsert(lbnd, bisector);
47 if ((p = hintersect(lbnd, bisector)) != NULL) {
48 PQdelete(lbnd);
49 PQinsert(lbnd, p, dist(p, newsite));
50 }
51 lbnd = bisector;
52 bisector = HEcreate(e, re);
53 ELinsert(lbnd, bisector);
54 if ((p = hintersect(bisector, rbnd)) != NULL)
55 PQinsert(bisector, p, dist(p, newsite));
56 newsite = nextsite(context);
57 } else if (!PQempty()) {
58 /* intersection is smallest */
59 lbnd = PQextractmin();
60 llbnd = ELleft(lbnd);
61 rbnd = ELright(lbnd);
62 rrbnd = ELright(rbnd);
63 bot = leftreg(lbnd);
64 top = rightreg(rbnd);
65 v = lbnd->vertex;
66 makevertex(v);
67 endpoint(lbnd->ELedge, lbnd->ELpm, v);
68 endpoint(rbnd->ELedge, rbnd->ELpm, v);
69 ELdelete(lbnd);
70 PQdelete(rbnd);
71 ELdelete(rbnd);
72 pm = le;
73 if (bot->coord.y > top->coord.y) {
74 temp = bot;
75 bot = top;
76 top = temp;
77 pm = re;
78 }
79 e = gvbisect(bot, top);
80 bisector = HEcreate(e, pm);
81 ELinsert(llbnd, bisector);
82 endpoint(e, re - pm, v);
83 deref(v);
84 if ((p = hintersect(llbnd, bisector)) != NULL) {
85 PQdelete(llbnd);
86 PQinsert(llbnd, p, dist(p, bot));
87 }
88 if ((p = hintersect(bisector, rrbnd)) != NULL) {
89 PQinsert(bisector, p, dist(p, bot));
90 }
91 } else
92 break;
93 }
94
95 for (lbnd = ELright(ELleftend); lbnd != ELrightend; lbnd = ELright(lbnd)) {
96 e = lbnd->ELedge;
97 clip_line(e);
98 }
99}
static Agobj_t * deref(Expr_t *pgm, Exnode_t *x, Exref_t *ref, Agobj_t *objp, Gpr_t *state)
Definition compile.c:278
Edge * gvbisect(Site *s1, Site *s2)
Definition edges.c:29
void endpoint(Edge *e, int lr, Site *s)
Definition edges.c:189
void edgeinit(void)
Definition edges.c:23
void clip_line(Edge *e)
Definition edges.c:73
#define le
Definition edges.h:26
#define re
Definition edges.h:27
static double dist(int dim, double *x, double *y)
node NULL
Definition grammar.y:149
void PQdelete(Halfedge *he)
Definition heap.c:61
bool PQempty(void)
Definition heap.c:77
Halfedge * PQextractmin(void)
Definition heap.c:95
void PQinitialize(void)
Definition heap.c:111
Point PQ_min(void)
Definition heap.c:83
void PQinsert(Halfedge *he, Site *v, double offset)
Definition heap.c:42
Halfedge * ELright(Halfedge *he)
Definition hedges.c:236
void ELinsert(Halfedge *lb, Halfedge *new)
Definition hedges.c:156
Halfedge * ELrightend
Definition hedges.c:19
Site * hintersect(Halfedge *el1, Halfedge *el2)
Definition hedges.c:54
Halfedge * ELleftbnd(Point *p)
Definition hedges.c:182
Site * rightreg(Halfedge *he)
Definition hedges.c:254
void ELinitialize(void)
Definition hedges.c:33
Halfedge * ELleft(Halfedge *he)
Definition hedges.c:241
Halfedge * HEcreate(Edge *e, char pm)
Definition hedges.c:143
Halfedge * ELleftend
Definition hedges.c:19
void ELdelete(Halfedge *he)
Definition hedges.c:228
Site * leftreg(Halfedge *he)
Definition hedges.c:247
static Agedge_t * top(gv_stack_t *sp)
Definition tred.c:71
void siteinit(void)
Definition site.c:22
Site * bottomsite
Definition site.c:17
void makevertex(Site *v)
Definition site.c:46
Definition edges.h:19
Edge * ELedge
Definition hedges.h:22
char ELpm
Definition hedges.h:24
Site * vertex
Definition hedges.h:25
double x
Definition geometry.h:23
double y
Definition geometry.h:23
Definition site.h:22
Point coord
Definition site.h:23
void voronoi(Site *(*nextsite)(void *context), void *context)
Definition voronoi.c:18