21Allow sep to be absolute additive (margin of n
points)
33#define DFLT_overlap "9:prism"
84 fprintf(stderr,
"xLayout ");
85 pr2graphs(g,GORIG(
agroot(g)));
86 fprintf(stderr,
" : n = %d K = %f T0 = %f loop %d C %f\n",
94#define X_T0 xParams.T0
96#define X_numIters xParams.numIters
97#define X_loopcnt xParams.loopcnt
111 const double xdelta = fabs(
ND_pos(q)[0] -
ND_pos(p)[0]);
112 const double ydelta = fabs(
ND_pos(q)[1] -
ND_pos(p)[1]);
113 return xdelta <=
WD2(p) +
WD2(q) && ydelta <=
HT2(p) +
HT2(q);
135 double dist2,
double X_ov,
double X_nonov) {
139 while (
dist2 == 0.0) {
140 xdelta = 5 - rand() % 10;
141 ydelta = 5 - rand() % 10;
142 dist2 = xdelta * xdelta + ydelta * ydelta;
145 force = X_ov /
dist2;
147 force = X_nonov /
dist2;
152 fprintf(stderr,
" ov Fr %f dist %f\n", force *
dist,
dist);
155 DISP(q)[0] += xdelta * force;
156 DISP(q)[1] += ydelta * force;
157 DISP(p)[0] -= xdelta * force;
158 DISP(p)[1] -= ydelta * force;
169 return doRep(p, q, xdelta, ydelta, xdelta * xdelta + ydelta * ydelta, X_ov,
179 fprintf(stderr,
"ov 1 Fa 0 din %f\n",
RAD(p) +
RAD(q));
186 const double dist = hypot(xdelta, ydelta);
187 const double din =
RAD(p) +
RAD(q);
188 const double dout =
dist - din;
189 const double force = dout * dout / ((
X_K + din) *
dist);
193 fprintf(stderr,
" ov 0 Fa %f din %f \n", force *
dist, din);
196 DISP(q)[0] -= xdelta * force;
197 DISP(q)[1] -= ydelta * force;
198 DISP(p)[0] += xdelta * force;
199 DISP(p)[1] += ydelta * force;
211 fprintf(stderr,
"=================\n");
215 DISP(n)[0] = DISP(n)[1] = 0;
221 ov =
applyRep(n, n1, X_ov, X_nonov);
231 const double temp2 = temp * temp;
235 const double disp[] = {DISP(n)[0], DISP(n)[1]};
236 const double len2 = disp[0] * disp[0] + disp[1] * disp[1];
243 const double len = sqrt(len2);
278 const double K = xpms.
K;
279 for (
int try = 0; ov &&
try < tries; ++
try) {
281 const double X_ov =
X_C * K2;
282 const double X_nonov =
nedges * X_ov * 2.0 / (nnodes * (nnodes - 1));
286 fprintf(stderr,
"try %d (%d): %d overlaps on ",
try, tries, ov);
287 pr2graphs(g,GORIG(
agroot(g)));
288 fprintf(stderr,
" \n");
293 const double temp =
cool(i);
296 ov =
adjust(g, temp, X_ov, X_nonov);
304 fprintf(stderr,
"Warning: %d overlaps remain on ", ov);
305 pr2graphs(g,GORIG(
agroot(g)));
306 fprintf(stderr,
"\n");
328 char* ovlp =
agget (g,
"overlap");
336 fprintf (stderr,
"xLayout ");
338 if (!ovlp || *ovlp ==
'\0') {
342 if ((cp = strchr(ovlp,
':')) && (cp == ovlp ||
gv_isdigit(*ovlp))) {
346 if (tries < 0) tries = 0;
356 fprintf (stderr,
"tries = %d, mode = %s\n", tries, rest);
358 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 const char adjust[]
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 int cntOverlaps(graph_t *g)
static double WD2(Agnode_t *n)
static int x_layout(graph_t *g, xparams *pxpms, int tries)
static double xinit_params(graph_t *g, int n, xparams *xpms)
static double RAD(Agnode_t *n)
static int overlap(node_t *p, node_t *q)
static int applyRep(Agnode_t *p, Agnode_t *q, double X_ov, double X_nonov)
static void applyAttr(Agnode_t *p, Agnode_t *q)
void fdp_xLayout(graph_t *g, xparams *xpms)
static int doRep(node_t *p, node_t *q, double xdelta, double ydelta, double dist2, double X_ov, double X_nonov)