rendered paste bodyalias relDoLayout {
var %SpringEmbedderIterations = 1000
var %k = 2
var %c = 0.01
var %MaxRepulsiveForceDistance = 6
var %MaxNodeMovement = 0.5
while (%SpringEmbedderIterations) {
var %a = 1
var %b = 2
var %totalNodes = $hget(relNodeLink,0).item
while (%a <= %totalNodes) {
while (%b <= %totalNodes) {
var %bl = $hget(relNodeLink,%b).item
var %al = $hget(relNodeLink,%a).item
var %deltaX = $calc($hget(relNodeX,%bl) - $hget(relNodeX,%al))
var %deltaY = $calc($hget(relNodeY,%bl) - $hget(relNodeY,%al))
var %distanceSquared = $calc(%deltaX ^2 + %deltaY ^2)
if (%distanceSquared < 0.01) {
var %deltaX = $calc($rand(0,1) / 10 + 0.1)
var %deltaY = $calc($rand(0,1) / 10 + 0.1)
var %distanceSquared = $calc(%deltaX ^2 + %deltaY ^2)
}
var %distance = $sqrt(%distanceSquared)
if (%distance < %MaxRepulsiveForceDistance) {
var %repulsiveForce = $calc(%k * %k / %distance)
hadd relNodeFX %bl $calc($calc(%repulsiveForce * %deltaX / %distance) + $hget(relNodeFX,%bl))
hadd relNodeFY %bl $calc($calc(%repulsiveForce * %deltaY / %distance) + $hget(relNodeFY,%bl))
hadd relNodeFX %al $calc($calc(%repulsiveForce * %deltaX / %distance) - $hget(relNodeFX,%al))
hadd relNodeFY %al $calc($calc(%repulsiveForce * %deltaY / %distance) - $hget(relNodeFY,%al))
}
inc %b
}
inc %a
}
var %edge = 1
var %edges = $hget(relLineSize,0).item
while (%edge <= %edges) {
var %el = $hget(relLineSize,%edge).item
var %nodeA = $gettok(%el,1,45)
var %nodeB = $gettok(%el,2,45)
var %deltaX = $calc($hget(relNodeX,%nodeB) - $hget(relNodeX,%nodeA))
var %deltaY = $calc($hget(relNodeY,%nodeB) - $hget(relNodeY,%nodeA))
var %distanceSquared = $calc(%deltaX ^2 + %deltaY ^2)
if (%distanceSquared < 0.01) {
var %deltaX = $calc($rand(0,1) / 10 + 0.1)
var %deltaY = $calc($rand(0,1) / 10 + 0.1)
var %distanceSquared = $calc(%deltaX ^2 * %deltaY ^2)
}
var %distane $sqrt(%distanceSquared)
if (%distance > %MaxRepulsiveForceDistance) {
var %distance = %MaxRepulsiveForceDistance
}
var %distanceSquared = $calc(%distance ^2)
var %attractiveForce = $calc($calc(%distanceSquared - $calc(%k * %k)) / %k)
var %attractiveForce = $calc(%attractiveForce * $calc($log($iif($calc($hget(relLineSize,%el) / 1) < 1,1,$v1) ) *0.5) +1)
hadd relNodeFX %nodeB $calc($calc(%attractiveForce * %deltaX / %distance) - $hget(relNodeFX,%nodeB))
hadd relNodeFY %nodeB $calc($calc(%attractiveForce * %deltaY / %distance) - $hget(relNodeFY,%nodeB))
hadd relNodeFX %nodeA $calc($calc(%attractiveForce * %deltaX / %distance) + $hget(relNodeFX,%nodeA))
hadd relNodeFY %nodeA $calc($calc(%attractiveForce * %deltaY / %distance) + $hget(relNodeFY,%nodeA))
var %a = 1
while (%totalNodes >= %a) {
var %al = $hget(relNodeLink,%a).item
var %xMovement = $calc(%c * $hget(relNodeFX,%al))
var %yMovement = $calc(%c * $hget(relNodeFY,%al))
var %max = %MaxNodeMovement
var %nmax = $calc(%MaxNodeMovement * -1)
if (%xMovement > %max) {
var %xMovement = %max
}
elseif (%xMovement < %nmax) {
var %xMovement = %nmax
}
if (%yMovement > %max) {
var %yMovement = %max
}
elseif (%yMovement < %nmax) {
var %yMovement = %nmax
}
hadd relNodeX %al $calc(%xMovement + $hget(relNodeX,%al))
hadd relNodeY %al $calc(%yMovement + $hget(relNodeY,%al))
hadd relNodeFX %al 0
hadd relNodeFY %al 0
inc %a
}
inc %edge
}
dec %SpringEmbedderIterations
echo -a ITERS LEFT: %SpringEmbedderIterations
}
}
alias relCalcbounds {
var %width = 1500
var %height = 900
var %BorderSize = 50
var %MinDiagramSize = 10
var %minX = $hget(relNodeX,1)
var %minY = $hget(relNodeY,1)
var %maxX = %minX
var %maxY = %minY
var %totalNodes = $hget(relNodeLink,0).item
var %node = 1
while (%totalNodes >= %node) {
var %al = $hget(relNodeLink,%node).item
var %nodeX = $hget(relNodeX,%al)
var %nodeY = $hget(relNodeY,%al)
if (%nodeX > %maxX) { var %maxX = %nodeX }
elseif (%nodeX < %minX) { var %minX = %nodeX }
if (%nodeY > %maxY) { var %maxY = %nodeY }
if (%nodeY < %minY) { var %minY = %nodeY }
inc %node
}
echo -a %minX %maxX %minY %maxY
if ($calc(%maxX - %minX) < %MinDiagramSize) {
var %midX = $calc($calc(%maxX + %minX) / 2)
var %minX = $calc(%midX - $calc(%MinDiagramSize / 2))
var %maxX = $calc(%midX + $calc(%MinDiagramSize / 2))
}
if ($calc(%maxY - %minY) < %MinDiagramSize) {
var %midY = $calc($calc(%maxY + %minY) / 2)
var %minY = $calc(%midY - $calc(%MinDiagramSize / 2))
var %maxY = $calc(%midY + $calc(%MinDiagramSize / 2))
}
var %xyRatio = $calc($calc(%maxX - %minX) / $calc(%maxY - %minY) / $calc(%width / %height))
if (%xyRatio > 1) {
var %dy = $calc(%maxY - %minY)
var %dy = $calc(%dy * %xyRatio - %dy)
var %minY = $calc(%minY - $calc(%dy / 2))
var %maxY = $calc(%maxY - $calc(%dy / 2))
}
else if (%xyRatio < 1) {
var %dx = $calc(%maxX - %minX)
var %dx = $calc(%dx * %xyRatio - %dx)
var %minX = $calc(%minX - $calc(%dx / 2))
var %maxX = $calc(%maxX - $calc(%dx / 2))
}
echo -a %minX %maxX %minY %maxY
var %relLineSize = $hget(relLineSize,0).item
var %maxWeight = 0
var %maxminX = $calc(%maxX - %minX)
var %maxminY = $calc(%maxY - %minY)
while (%relLineSize) {
var %edge = $hget(relLineSize,%relLineSize).item
if ($hget(relLineSize,%edge) > %maxWeight) {
var %maxWeight = $v1
}
var %nodeA = $gettok(%edge,1,45)
var %nodeB = $gettok(%edge,2,45)
var %x1 = $calc($calc(%width * $calc($hget(relNodeX,%nodeA) - minX) / %maxminX) + %borderSize)
var %x2 = $calc($calc(%height * $calc($hget(relNodeY,%nodeA) - minY) / %maxminY) + %borderSize)
var %x3 = $calc($calc(%width * $calc($hget(relNodeX,%nodeB) - minX) / %maxminX) + %borderSize)
var %x4 = $calc($calc(%height * $calc($hget(relNodeY,%nodeB) - minY) / %maxminY) + %borderSize)
echo -a %nodeA %nodeB %x1 %x2 %x3 %x4 </> $hget(relNodeX,%nodeA) $hget(relNodeY,%nodeA) $hget(relNodeY,%nodeB) $hget(relNodeY,%nodeB)
hadd relNodeNX %nodeA $int(%x1)
hadd relNodeNY %nodeA $int(%x2)
hadd relNodeNX %nodeB $int(%x3)
hadd relNodeNY %nodeB $int(%x4)
dec %relLineSize
}
echo -a MAX WEIGHT %maxWeight
}