All pastes #497392 Raw Edit

Viki

public text v1 · immutable
·published 2007-05-19 20:39 UTC
rendered paste body
alias 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
}