/* getPos: */ static real *getPos(Agraph_t * g, spring_electrical_control ctrl) { Agnode_t *n; real *pos = N_NEW(Ndim * agnnodes(g), real); int ix, i; if (agfindnodeattr(g, "pos") == NULL) return pos; for (n = agfstnode(g); n; n = agnxtnode(g, n)) { i = ND_id(n); if (hasPos(n)) { for (ix = 0; ix < Ndim; ix++) { pos[i * Ndim + ix] = ND_pos(n)[ix]; } } } return pos; }
/* initLayout: * Initialize node coordinates. If the node already has * a position, use it. * Return true if some node is fixed. */ int initLayout(vtx_data * graph, int n, int dim, double **coords, node_t ** nodes) { node_t *np; double *xp; double *yp; double *pt; int i, d; int pinned = 0; xp = coords[0]; yp = coords[1]; for (i = 0; i < n; i++) { np = nodes[i]; if (hasPos(np)) { pt = ND_pos(np); *xp++ = *pt++; *yp++ = *pt++; if (dim > 2) { for (d = 2; d < dim; d++) coords[d][i] = *pt++; } if (isFixed(np)) pinned = 1; } else { *xp++ = drand48(); *yp++ = drand48(); if (dim > 2) { for (d = 2; d < dim; d++) coords[d][i] = drand48(); } } } for (d = 0; d < dim; d++) orthog1(n, coords[d]); return pinned; }