Ik wil met behulp van JS een linked network weergeven, iets als dit:

Ik heb van elke node info met welke andere hij is gelinked, verder niets. Geen plaatscoordinaten dus. Wat ik graag wil is een algorithme die voor mij een zo lekker mogelijke verdeling maakt. Dit wil ik onder andere gebruiken voor het weergeven van moleculen (uit cml), maar ook voor algemenere netwerken (contact netwerk en een citatienetwerk). Probleem is dat ik niet goed uit een goede methode kom
ik heb al eens dit gemaakt: http://www.rikkertkoppes.com/brain2.0/network/springs.html waar gerekend wordt met veren tussen de verschillende nodes (voor Fx: http://www.rikkertkoppes.com/brain2.0/network/springs.php in svg)
Daar ben ik heel fysisch te werk gegaan, dus voor elke node de links langslopen, de afstand ertussen uitrekenen, vervolgens de kracht, dan alle krachten van alle links optellen, delen door de "massa" en de versnelling uitrekenen, daaruit volgt dan vervolgens een verplaatsing van 1 node.
Dat is erg omslachtig allemaal. Als ik nu voorstel dat alle nodes ladingen zijn en elkaar afstoten kom ik op het volgende:
dat zou alle nodes uit elkaar drijven (tot de rand van het gebied als je dat erbij haalt). Iets netter zou zijn om eerst alle verplaatsingen uit te rekenen en dan op te tellen voor alle nodes en dan pas daadwerkelijk uit te voeren. Dat doe ik ook bij die veren.
Alleen nu nog de links ertussen. Natuurlijk worden twee nodes die aan elkaar gelinked zijn niet uit elkaar gedreven, da's een kwestie van checken, maar een andere node die een bepaalde node wegduwt, heeft zo ook invloed op alle nodes die aan die laatste gelinked zijn. Hoe ga ik dat oplossen?

Ik heb van elke node info met welke andere hij is gelinked, verder niets. Geen plaatscoordinaten dus. Wat ik graag wil is een algorithme die voor mij een zo lekker mogelijke verdeling maakt. Dit wil ik onder andere gebruiken voor het weergeven van moleculen (uit cml), maar ook voor algemenere netwerken (contact netwerk en een citatienetwerk). Probleem is dat ik niet goed uit een goede methode kom
ik heb al eens dit gemaakt: http://www.rikkertkoppes.com/brain2.0/network/springs.html waar gerekend wordt met veren tussen de verschillende nodes (voor Fx: http://www.rikkertkoppes.com/brain2.0/network/springs.php in svg)
Daar ben ik heel fysisch te werk gegaan, dus voor elke node de links langslopen, de afstand ertussen uitrekenen, vervolgens de kracht, dan alle krachten van alle links optellen, delen door de "massa" en de versnelling uitrekenen, daaruit volgt dan vervolgens een verplaatsing van 1 node.
Dat is erg omslachtig allemaal. Als ik nu voorstel dat alle nodes ladingen zijn en elkaar afstoten kom ik op het volgende:
bekijk voor elke node:
de afstand tot alle andere nodes,
als deze binnen een bepaalde straal zit (om niet alles te hoeven meenemen):
verplaats beide nodes een stukje uit elkaar (evenredig met 1/r[sup]2[/sup])
herhaal dit voor de afstand tot alle nodes
herhaal dit voor alle nodes
dat zou alle nodes uit elkaar drijven (tot de rand van het gebied als je dat erbij haalt). Iets netter zou zijn om eerst alle verplaatsingen uit te rekenen en dan op te tellen voor alle nodes en dan pas daadwerkelijk uit te voeren. Dat doe ik ook bij die veren.
Alleen nu nog de links ertussen. Natuurlijk worden twee nodes die aan elkaar gelinked zijn niet uit elkaar gedreven, da's een kwestie van checken, maar een andere node die een bepaalde node wegduwt, heeft zo ook invloed op alle nodes die aan die laatste gelinked zijn. Hoe ga ik dat oplossen?
