18
doRep (fdp_data* p, fdp_data* q, double xdelta, double ydelta, double dist2)
22
while (dist2 == 0.0) {
23
xdelta = 5 - rand()%10;
24
ydelta = 5 - rand()%10;
25
dist2 = xdelta*xdelta + ydelta*ydelta;
28
q->disp.x += xdelta * force;
29
q->disp.y += ydelta * force;
30
p->disp.x -= xdelta * force;
31
p->disp.y -= ydelta * force;
35
applyRep (fdp_data* p, fdp_data* q)
37
double xdelta, ydelta;
39
xdelta = q->pos.x - p->pos.x;
40
ydelta = q->pos.y - p->pos.y;
41
doRep (p, q, xdelta, ydelta, xdelta*xdelta + ydelta*ydelta);
45
applyAttr (fdp_data* p, fdp_data* q)
47
double xdelta, ydelta;
52
xdelta = q->pos.x - p->pos.x;
53
ydelta = q->pos.y - p->pos.y;
54
dist2 = xdelta*xdelta + ydelta*ydelta;
57
q->disp.x -= xdelta * force;
58
q->disp.y -= ydelta * force;
59
p->disp.x += xdelta * force;
60
p->disp.y += ydelta * force;
64
doNeighbor (Grid* grid, int i, int j, node_list* nodes)
66
cell* cellp = findGrid (grid, i, j);
71
double xdelta, ydelta;
76
fprintf (stderr, " doNeighbor (%d,%d) : %d\n", i, j, length (cellp));
77
for (p = nodes; p != 0; p = p->next) {
78
datap = getData (p->node);
79
for (q = cellp->nodes; q != 0; q = q->next) {
81
if (UseComp && !sameComponent (p->node,q->node)) continue;
83
if (!sameComponent (p->node,q->node)) continue;
85
dataq = getData (q->node);
86
xdelta = dataq->pos.x - datap->pos.x;
87
ydelta = dataq->pos.y - datap->pos.y;
88
dist2 = xdelta*xdelta + ydelta*ydelta;
90
doRep (datap, dataq, xdelta, ydelta, dist2);
97
gridRepulse (Dt_t* dt, void* v, void* g)
99
cell* cellp = (cell*)v;
100
Grid* grid = (Grid*)g;
101
node_list* nodes = cellp->nodes;
110
fprintf (stderr, "gridRepulse (%d,%d) : %d\n", i, j, length (cellp));
111
for (p = nodes; p != 0; p = p->next) {
112
data = getData (p->node);
113
for (q = nodes; q != 0; q = q->next)
115
if ((p != q) && (!UseComp || sameComponent (p->node,q->node)))
117
if ((p != q) && sameComponent (p->node,q->node))
119
applyRep (data, getData (q->node));
122
doNeighbor(grid, i - 1, j - 1, nodes);
123
doNeighbor(grid, i - 1, j , nodes);
124
doNeighbor(grid, i - 1, j + 1, nodes);
125
doNeighbor(grid, i , j - 1, nodes);
126
doNeighbor(grid, i , j + 1, nodes);
127
doNeighbor(grid, i + 1, j - 1, nodes);
128
doNeighbor(grid, i + 1, j , nodes);
129
doNeighbor(grid, i + 1, j + 1, nodes);
135
adjust (Agraph_t* g, double temp)
145
static Grid* grid = 0;
147
if (temp <= 0.0) return;
150
int nnodes = agnnodes(g);
151
grid = resetGrid (nnodes, nnodes, grid);
154
for (n = agfstnode(g); n; n = agnxtnode(n)) {
156
data->disp.x = data->disp.y = 0;
158
addGrid (grid, (int)floor(data->pos.x/CellW), (int)floor(data->pos.y/CellH), n);
162
for (n = agfstnode(g); n; n = agnxtnode(n)) {
164
for (e = agfstout(n); e; e = agnxtout(e))
165
applyAttr (data, getData (aghead(e)));
167
walkGrid (grid, gridRepulse);
170
for (n = agfstnode(g); n; n = agnxtnode(n)) {
172
for (n1 = agnxtnode(n); n1; n1 = agnxtnode(n1)) {
174
if (!UseComp || sameComponent (n,n1))
176
if (sameComponent (n,n1))
178
applyRep (data, getData(n1));
180
for (e = agfstout(n); e; e = agnxtout(e)) {
181
applyAttr (data, getData(aghead(e)));
187
for (n = agfstnode(g); n; n = agnxtnode(n)) {
189
if (data->fixed) continue;
191
len2 = disp.x*disp.x + disp.y*disp.y;
194
data->pos.x += disp.x;
195
data->pos.y += disp.y;
198
/* to avoid sqrt, consider abs(x) + abs(y) */
200
data->pos.x += (disp.x * temp)/len;
201
data->pos.y += (disp.y * temp)/len;
204
/* Keep withing box */
206
if (data->pos.x < 0) data->pos.x = 0;
207
else if (data->pos.x > Width) data->pos.x = Width;
208
if (data->pos.y < 0) data->pos.y = 0;
209
else if (data->pos.y > Height) data->pos.y = Height;