Алгоритм Spring Graph с размером узла - PullRequest
5 голосов
/ 21 июня 2011

Мне нужно сделать несколько графических макетов, и я искал что-то вроде алгоритма макета Spring, реализованного здесь и обсужденного здесь

Однако все мои узлы имеют ширину и высоту (это диаграмма сущностей). Кто-нибудь может объяснить, как я могу включить это в уравнение?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2014

заглянув внутрь первой ссылки, которую вы указали, есть строка 240:

var repulsiveForce = this.k * this.k / d;

, которая представляет потенциал отталкивания (это физика).Чем больше это число, тем менее вероятно геометрическое состояние.d - это расстояние между двумя узлами, а this.k - это жесткость пружины.Этот потенциал становится бесконечным для расстояния d = 0.

. Вы хотите перевести этот потенциал на определенную длину (размер ваших ящиков), поэтому замените d на d - length.Это означает, что сила отталкивания становится бесконечной на расстоянии length.По-прежнему остается проблема, заключающаяся в том, что силы отталкивания затем уменьшаются для расстояний, меньших length, которые должны быть покрыты некоторыми условными выражениями:

if (d + 0.0001 < length) repulsiveForce = bigbigNumber;

Я добавил 0.0001, чтобы сила отталкивания никогда не становиласьбесконечный, но только большой, потому что компьютеры не очень хорошо справляются с бесконечностью.

0 голосов
/ 28 июня 2013

Взяв Graph JavaScript Framework за отправную точку, вы можете сделать следующее.Я предполагаю, что класс Node был расширен атрибутами width и height.Затем в функции layoutRepulsive выражение для вычисления расстояний между узлами должно быть изменено для соответствия этим размерам:

var dx = Math.max(0, Math.abs(node2.layoutPosX - node1.layoutPosX) - 0.5*(node2.width+node1.width));
var dy = Math.max(0, Math.abs(node2.layoutPosY - node1.layoutPosY) - 0.5*(node2.height+node1.height));

Функция максимума устанавливает 0 как минимально возможное значение для расстояния, дажекогда их ограничивающие рамки перекрываются.

...