20Allow sep to be absolute additive (margin of n
points)
40#define DFLT_overlap "9:prism"
42#define WD2(n) (X_marg.doAdd ? (ND_width(n)/2.0 + X_marg.x): ND_width(n)*X_marg.x/2.0)
43#define HT2(n) (X_marg.doAdd ? (ND_height(n)/2.0 + X_marg.y): ND_height(n)*X_marg.y/2.0)
90 fprintf(stderr,
"xLayout ");
91 pr2graphs(g,GORIG(
agroot(g)));
92 fprintf(stderr,
" : n = %d K = %f T0 = %f loop %d C %f\n",
99#define X_T0 xParams.T0
101#define X_numIters xParams.numIters
102#define X_loopcnt xParams.loopcnt
123 return hypot(
dx,
dy);
148 bBox(p, &p_ll, &p_ur);
149 bBox(q, &q_ll, &q_ur);
151 if (q_ll.
x > p_ur.
x) {
152 if (q_ll.
y > p_ur.
y) {
153 return dist(p_ur, q_ll);
154 }
else if (q_ll.
y >= p_ll.
y) {
155 return q_ll.
x - p_ur.
x;
157 if (q_ur.
y >= p_ll.
y)
158 return q_ll.
x - p_ur.
x;
162 return dist(p_ur, q_ll);
165 }
else if (q_ll.
x >= p_ll.
x) {
166 if (q_ll.
y > p_ur.
y) {
167 return q_ll.
y - p_ur.
x;
168 }
else if (q_ll.
y >= p_ll.
y) {
171 if (q_ur.
y >= p_ll.
y)
174 return p_ll.
y - q_ur.
y;
177 if (q_ll.
y > p_ur.
y) {
178 if (q_ur.
x >= p_ll.
x)
179 return q_ll.
y - p_ur.
y;
183 return dist(p_ur, q_ll);
185 }
else if (q_ll.
y >= p_ll.
y) {
186 if (q_ur.
x >= p_ll.
x)
189 return p_ll.
x - q_ur.
x;
191 if (q_ur.
x >= p_ll.
x) {
192 if (q_ur.
y >= p_ll.
y)
195 return p_ll.
y - q_ur.
y;
197 if (q_ur.
y >= p_ll.
y)
198 return p_ll.
x - q_ur.
x;
200 return dist(p_ll, q_ur);
213 double xdelta, ydelta;
218 ret = xdelta <=
WD2(p) +
WD2(q) && ydelta <=
HT2(p) +
HT2(q);
221 double dist2, xdelta, ydelta;
227 dist2 = xdelta * xdelta + ydelta * ydelta;
228 return dist2 <= din * din;
257#if defined(DEBUG) || defined(MS) || defined(ALT)
261 while (
dist2 == 0.0) {
262 xdelta = 5 - rand() % 10;
263 ydelta = 5 - rand() % 10;
264 dist2 = xdelta * xdelta + ydelta * ydelta;
267 dout = fmax(boxDist(p, q),
EPSILON);
269 force =
K2 / (dout *
dist);
298 fprintf(stderr,
" ov Fr %f dist %f\n", force *
dist,
dist);
301 DISP(q)[0] += xdelta * force;
302 DISP(q)[1] += ydelta * force;
303 DISP(p)[0] -= xdelta * force;
304 DISP(p)[1] -= ydelta * force;
314 double xdelta, ydelta;
318 return doRep(p, q, xdelta, ydelta, xdelta * xdelta + ydelta * ydelta);
323 double xdelta, ydelta;
330 dout = boxDist(p, q);
335 dist = hypot(xdelta, ydelta);
336 force = dout * dout / (
X_K *
dist);
340 dist = hypot(xdelta, ydelta);
345 force = dout * dout / ((
X_K + din) *
dist);
351 fprintf(stderr,
"ov 1 Fa 0 din %f\n",
RAD(p) +
RAD(q));
358 dist = hypot(xdelta, ydelta);
361 force = dout * dout / ((
X_K + din) *
dist);
366 fprintf(stderr,
" ov 0 Fa %f din %f \n", force *
dist, din);
369 DISP(q)[0] -= xdelta * force;
370 DISP(q)[1] -= ydelta * force;
371 DISP(p)[0] += xdelta * force;
372 DISP(p)[1] += ydelta * force;
392 fprintf(stderr,
"=================\n");
396 DISP(n)[0] = DISP(n)[1] = 0;
416 disp[0] = DISP(n)[0];
417 disp[1] = DISP(n)[1];
418 len2 = disp[0] * disp[0] + disp[1] * disp[1];
468 while (ov &&
try < tries) {
475 fprintf(stderr,
"try %d (%d): %d overlaps on ",
try, tries, ov);
476 pr2graphs(g,GORIG(
agroot(g)));
477 fprintf(stderr,
" \n");
494 fprintf(stderr,
"Warning: %d overlaps remain on ", ov);
495 pr2graphs(g,GORIG(
agroot(g)));
496 fprintf(stderr,
"\n");
518 char* ovlp =
agget (g,
"overlap");
526 fprintf (stderr,
"xLayout ");
528 if (!ovlp || *ovlp ==
'\0') {
532 if ((cp = strchr(ovlp,
':')) && (cp == ovlp ||
gv_isdigit(*ovlp))) {
536 if (tries < 0) tries = 0;
546 fprintf (stderr,
"tries = %d, mode = %s\n", tries, rest);
548 if (tries && !
x_layout(g, xpms, tries))
expand_t sepFactor(graph_t *g)
int removeOverlapAs(graph_t *G, char *flag)
Use flag value to determine if and how to remove node overlaps.
static int overlaps(nitem *p, int cnt)
static double dist(int dim, double *x, double *y)
#define PS2INCH(a_points)
static double len(glCompPoint p)
static int cnt(Dict_t *d, Dtlink_t **set)
int agnedges(Agraph_t *g)
int agnnodes(Agraph_t *g)
char * agget(void *obj, char *name)
Agedge_t * agfstout(Agraph_t *g, Agnode_t *n)
Agedge_t * agnxtout(Agraph_t *g, Agedge_t *e)
Agnode_t * agnxtnode(Agraph_t *g, Agnode_t *n)
Agnode_t * agfstnode(Agraph_t *g)
char * agnameof(void *)
returns a string descriptor for the object.
Agraph_t * agroot(void *obj)
replacements for ctype.h functions
static bool gv_isdigit(int c)
static int between(double f, double g, double h)
PATHUTIL_API COORD dist2(Ppoint_t, Ppoint_t)
static int nedges
total no. of edges used in routing
static void xinit_params(graph_t *g, int n, xparams *xpms)
static int cntOverlaps(graph_t *g)
static int x_layout(graph_t *g, xparams *pxpms, int tries)
static double RAD(Agnode_t *n)
static int overlap(node_t *p, node_t *q)
static int applyRep(Agnode_t *p, Agnode_t *q)
static void applyAttr(Agnode_t *p, Agnode_t *q)
static int doRep(node_t *p, node_t *q, double xdelta, double ydelta, double dist2)
void fdp_xLayout(graph_t *g, xparams *xpms)