Vraag Grafiek theorie - op kracht gebaseerd autolayout-algoritme


Ik wil gewoon controleren of ik mijn theorie heb voordat ik begin met de implementatie.

constanten:

  • m = massa van vertex (allemaal hetzelfde - waarschijnlijk ingesteld op straal van knoop)
  • k = constante randkracht.
  • l = lengte van de rand bij "minimale energietoestand".

Variabelen:

  • d = afstand tussen twee hoekpunten.
  • cl = huidige lengte van de rand.

Theorie: Elke vertex heeft een afstotende kracht op elke andere top die is: m / (d^2). Voor elke rand vertoont het een kracht waarbij beide hoekpunten ze in de richting "slepen" om de rand naar de "minimale energietoestand" te krijgen; dus elke vertex: -k * ((l - cl) / 2).

pseudocode:

until energy minimal state
   for each vertex v1
      for each vertex v2
         if v1 != v2
            v1.velocity += m / square_distance (v1, v2)
         endif
      end
   end
   for each edge e
      e.v1.velocity += -k * (delta_min_energy_len (e) / 2)
      e.v2.velocity += -k * (delta_min_energy_len (e) / 2)
   end
   for each vertex v
      v.position += (v.velocty * dampening_constant)
   end                
end

reacties: Zou dit ook werken? Wat moet ik instellen m en k naar?


11
2018-04-25 14:37


oorsprong


antwoorden:


Je bent in de goede richting. Je terminologie / fysica is een beetje uitgeschakeld: wat je massa noemt en "k" is min of meer verward met wat beter "lading" genoemd kan worden (voor de omgekeerde kwadratische wetsafstoting) en "veerconstante" voor de De aantrekkingskracht van Hooke's.

Zoals opgemerkt in reacties op je vraag, heb je wel wat demping nodig, die eigenlijk energie uit het systeem haalt, anders oscilleert het alleen maar om potentiële energie om te zetten in kinetische energie en voor altijd terug. Erger nog, problemen met simulatienauwkeurigheid kunnen gemakkelijk leiden tot het oneindig toenemen van energie en de simulatie "gek worden" als je niet voorzichtig bent.

Deze wikipedia-artikel heeft een aardige pseudocode die je erg lijkt op de jouwe, maar met de bovenstaande punten geadresseerd (hoewel je opmerkt dat zelfs die pseudocode een massa-op-massa mist in de versnellingsberekening, zie de discussie op de pagina).

Je moet ook een beetje nadenken over de initiële distributie waarmee je de simulatie start en hoe je veel geeft om de mogelijkheid om vast te lopen in een lokaal minimum als er een (misschien) veel beter wereldwijd minimum bestaat. Deze punten zijn gerelateerd; veel hangt af van de topologie van uw grafiek. Als het een eenvoudige boom is, heb je weinig moeite om een ​​mooie lay-out te krijgen. Als het veel lussen en structuur heeft ... veel geluk.


5
2018-05-13 19:59



Ik zou niet dezelfde m voor elke vertex kiezen. In plaats daarvan zou ik het proportioneel maken met het aantal andere hoekpunten waarmee het verbonden is. Op die manier, extremiteiten van de grafiek die sneller wegvliegen naar hun positie dan sterk verbonden.

Ik heb geen idee voor k.


1
2018-05-13 19:01