21Allow sep to be absolute
33#define DFLT_overlap "9:prism"
57 fprintf(stderr,
"(%s)",
agnameof(g1));
85 fprintf(stderr,
"xLayout ");
86 pr2graphs(g, GORIG(
agroot(g)));
87 fprintf(stderr,
" : n = %d K = %f T0 = %f loop %d C %f\n",
xParams.
numIters,
94#define X_T0 xParams.T0
96#define X_numIters xParams.numIters
97#define X_loopcnt xParams.loopcnt
104 const double xdelta = fabs(
ND_pos(q)[0] -
ND_pos(p)[0]);
105 const double ydelta = fabs(
ND_pos(q)[1] -
ND_pos(p)[1]);
106 return xdelta <=
WD2(p) +
WD2(q) && ydelta <=
HT2(p) +
HT2(q);
123 double dist,
double X_ov,
double X_nonov) {
127 while (!(
dist > 0)) {
128 xdelta = 5 - rand() % 10;
129 ydelta = 5 - rand() % 10;
130 dist = hypot(xdelta, ydelta);
141 fprintf(stderr,
" ov Fr %f dist %f\n", force *
dist,
dist);
144 DISP(q)[0] += xdelta * force;
145 DISP(q)[1] += ydelta * force;
146 DISP(p)[0] -= xdelta * force;
147 DISP(p)[1] -= ydelta * force;
157 return doRep(p, q, xdelta, ydelta, hypot(xdelta, ydelta), X_ov, X_nonov);
165 fprintf(stderr,
"ov 1 Fa 0 din %f\n",
RAD(p) +
RAD(q));
172 const double dist = hypot(xdelta, ydelta);
173 const double din =
RAD(p) +
RAD(q);
174 const double dout =
dist - din;
175 const double force = dout * dout / ((
X_K + din) *
dist);
179 fprintf(stderr,
" ov 0 Fa %f din %f \n", force *
dist, din);
182 DISP(q)[0] -= xdelta * force;
183 DISP(q)[1] -= ydelta * force;
184 DISP(p)[0] += xdelta * force;
185 DISP(p)[1] += ydelta * force;
196 fprintf(stderr,
"=================\n");
200 DISP(n)[0] = DISP(n)[1] = 0;
206 ov =
applyRep(n, n1, X_ov, X_nonov);
216 const double temp2 = temp * temp;
220 const double disp[] = {DISP(n)[0], DISP(n)[1]};
221 const double len2 = disp[0] * disp[0] + disp[1] * disp[1];
228 const double len = sqrt(len2);
261 const double K = xpms.
K;
262 for (
int try = 0; ov &&
try < tries; ++
try) {
264 const double X_ov =
X_C * K2;
265 const double X_nonov =
nedges * X_ov * 2.0 / (nnodes * (nnodes - 1));
269 fprintf(stderr,
"try %d (%d): %d overlaps on ",
try, tries, ov);
270 pr2graphs(g, GORIG(
agroot(g)));
271 fprintf(stderr,
" \n");
276 const double temp =
cool(i);
279 ov =
adjust(g, temp, X_ov, X_nonov);
287 fprintf(stderr,
"Warning: %d overlaps remain on ", ov);
288 pr2graphs(g, GORIG(
agroot(g)));
289 fprintf(stderr,
"\n");
309 char *ovlp =
agget(g,
"overlap");
317 fprintf(stderr,
"xLayout ");
319 if (!ovlp || *ovlp ==
'\0') {
323 if ((cp = strchr(ovlp,
':')) && (cp == ovlp ||
gv_isdigit(*ovlp))) {
337 fprintf(stderr,
"tries = %d, mode = %s\n", tries, rest);
339 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)
struct fdpParms_s * fdp_parms
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)
static int nedges
total no. of edges used in routing
double Mlimit
distance beyond which repulsive force is 0
static int cntOverlaps(graph_t *g)
return number of overlaps
static int doRep(node_t *p, node_t *q, double xdelta, double ydelta, double dist, double X_ov, double X_nonov)
return 1 if nodes overlap
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)
return true if nodes overlap
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)