public function enterFrame(evt:Event) { for (i in edges) { var nvx = nodes[edges[i].to].x - nodes[edges[i].from].x; var nvy = nodes[edges[i].to].y - nodes[edges[i].from].y; var nlen = Math.sqrt(nvx * nvx + nvy * nvy); nlen = (nlen == 0) ? .0001 : nlen; var f = (edges[i].len - nlen) / (nlen * 3); var ndx = f * nvx; var ndy = f * nvy; nodes[edges[i].to].dx += ndx; nodes[edges[i].to].dy += ndy; nodes[edges[i].from].dx += -ndx; nodes[edges[i].from].dy += -ndy; edges[i].graphics.clear(); edges[i].graphics.lineStyle(1, 0xFFFFFF, 100); edges[i].graphics.moveTo(nodes[edges[i].from].x, nodes[edges[i].from].y); edges[i].graphics.lineTo(nodes[edges[i].to].x, nodes[edges[i].to].y); } for (i in nodes) { var dx = 0; var dy = 0; for (j in nodes) { if (i == j) continue; var vx = nodes[i].x - nodes[j].x; var vy = nodes[i].y - nodes[j].y; var len = vx * vx + vy * vy; if (len == 0) { dx += Math.random(); dy += Math.random(); } else if (len < 100*100) { dx += vx / len; dy += vy / len; } } var dlen = dx * dx + dy * dy; if (dlen > 0) { dlen = Math.sqrt(dlen) / 2; nodes[i].dx += dx / dlen; nodes[i].dy += dy / dlen; } } for (i in nodes) { var movx = Math.max(-5, Math.min(5, nodes[i].dx)); var movy = Math.max(-5, Math.min(5, nodes[i].dy)); if(nodes[i].isDragging == false) // dragging { if(Math.abs(movx) > 1) nodes[i].x += movx; if(Math.abs(movy) > 1) nodes[i].y += movy; } if (nodes[i].x < 0) { nodes[i].x = 0; } else if (nodes[i].x > stage.stageWidth) { nodes[i].x = stage.stageWidth; } if (nodes[i].y < 0) { nodes[i].y = 0; } else if (nodes[i].y > stage.stageHeight) { nodes[i].y = stage.stageHeight; } nodes[i].dx /= 2; nodes[i].dy /= 2; } }