/* applyAttr: * Attractive force = weight*(d*d)/K * or force = (d - L(e))*weight(e) */ static void applyAttr (Agnode_t* p, Agnode_t* q, Agedge_t* e) { double xdelta, ydelta; double force; double dist; double dist2; xdelta = ND_pos(q)[0] - ND_pos(p)[0]; ydelta = ND_pos(q)[1] - ND_pos(p)[1]; dist2 = xdelta*xdelta + ydelta*ydelta; while (dist2 == 0.0) { xdelta = 5 - rand()%10; ydelta = 5 - rand()%10; dist2 = xdelta*xdelta + ydelta*ydelta; } dist = sqrt (dist2); if (T_useNew) force = (ED_factor(e) * (dist - ED_dist(e)))/dist; else force = (ED_factor(e) * dist)/ED_dist(e); DISP(q)[0] -= xdelta * force; DISP(q)[1] -= ydelta * force; DISP(p)[0] += xdelta * force; DISP(p)[1] += ydelta * force; }
/* init_edge: */ static void init_edge(edge_t * e, attrsym_t * E_len) { ED_factor(e) = late_double(e, E_weight, 1.0, 0.0); ED_dist(e) = late_double(e, E_len, fdp_parms.K, 0.0); common_init_edge(e); }
static double setEdgeLen(graph_t * G, node_t * np, int lenx) { edge_t *ep; double total_len = 0.0; double len; for (ep = agfstout(G, np); ep; ep = agnxtout(G, ep)) { len = doubleattr(ep, lenx, 1.0); if (len <= 0) { agerr(AGERR, "bad edge len %f in %s ignored\n", len, G->name); len = 1.0; } ED_dist(ep) = len; total_len += len; } return total_len; }
int circuit_model(graph_t * g, int nG) { double **Gm; double **Gm_inv; int rv; long i, j; node_t *v; edge_t *e; Gm = new_array(nG, nG, 0.0); Gm_inv = new_array(nG, nG, 0.0); /* set non-diagonal entries */ for (v = agfstnode(g); v; v = agnxtnode(g, v)) { for (e = agfstedge(g, v); e; e = agnxtedge(g, e, v)) { i = AGID(agtail(e)); j = AGID(aghead(e)); if (i == j) continue; /* conductance is 1/resistance */ Gm[i][j] = Gm[j][i] = -1.0 / ED_dist(e); /* negate */ } } rv = solveCircuit(nG, Gm, Gm_inv); if (rv) for (i = 0; i < nG; i++) { for (j = 0; j < nG; j++) { GD_dist(g)[i][j] = Gm_inv[i][i] + Gm_inv[j][j] - 2.0 * Gm_inv[i][j]; } } free_array(Gm); free_array(Gm_inv); return rv; }