Ошибка одного узла в Arbor.JS - PullRequest
5 голосов
/ 07 октября 2011

При создании тривиального графа JS Arbor с одним узлом узел колеблется повсюду, и дальнейшие узлы не могут быть добавлены.

Проблема также сообщается другим пользователем:

https://github.com/samizdatco/arbor/issues/12

Буду признателен за помощь с исправлением / обходным решением

Ответы [ 5 ]

2 голосов
/ 24 апреля 2016

Мы используем обходное решение для этого.Вероятно, это скорее взлом, чем полное решение, но его легко реализовать и он отлично работает в большинстве случаев.

Что мы делаем, так это то, что мы определяем количество частиц в системе при каждом добавлении частицы илиудален.Если это число равно единице, мы добавляем в систему новую частицу, цвет которой установлен на цвет фона холста.Поскольку цвет узла такой же, как и у фона, он не виден.

Так что ни на одной точке нет ни одного узла на графике.Всякий раз, когда это происходит из-за добавления или удаления, мы добавляем этот скрытый узел балансировки.Вы можете взглянуть на наш веб-сайт, чтобы увидеть живой пример выше: http://www.graphthinker.com. Когда вы добавляете узлы, вы можете увидеть, что график продолжает реагировать, даже если у него есть только один (видимый) узел.

Этот скрытый балансировочный узел может быть удален, когда он больше не нужен, например, когда добавляется другой узел или когда удаляется только видимый узел.

2 голосов
/ 29 июня 2012

Использование библиотеки d3.js вместо Arbor решило мою проблему: -)

2 голосов
/ 05 марта 2012

Это не совсем исправление, но я считаю количество узлов и, если меньше, чем на, я устанавливаю трение на 1,0

if (nodeCount == 1) {
   //Stop single nodes bouncing all over the place
   sys.parameters({ friction: '1.0' });
}
1 голос
/ 01 августа 2014

Другой вариант - заменить файл physics.js на этот один. Он имеет несколько исправлений для компенсации проблем, связанных с наличием одного узла (включая проблемы с добавлением второго узла).

0 голосов
/ 03 июня 2015

попробуйте

if (nodeCount == 1) {
            sys.parameters({ repulsion: 10, gravity: false, dt: 0.035 })
        }
        else if (nodeCount > 1 && nodeCount < 30) {
            sys.parameters({ repulsion: 1000, gravity: false, dt: 0.35 })
        }
        else {
            sys.parameters({ friction: .1, stiffness: 0.1, repulsion: 1, gravity: false, dt: 0.035 })
        }
...