Если вы хотите нарисовать дерево с минимальным потерянным пространством и короткими соединениями, то вам нужно вычислительно дорогое решение. Будет трудно добиться того, чтобы это было в реальном времени на дереве приличного размера, не говоря уже о том, что небольшие изменения в дереве могут привести к радикально другому равновесию.
Другим подходом было бы отказаться от физического моделирования и просто построить его итеративно. Я делал нечто подобное на прошлой неделе, но мои деревья, вероятно, намного менее вовлечены, чем ваши.
Для этого древовидного макета каждый объект узла должен хранить угол и смещение. Эти два числа определяют, где они оказываются на графической поверхности.
Вот мой основной алгоритм:
1) Изучите все древовидные данные и найдите все узлы листьев.
2) пока вы делаете это, не забудьте измерить длину каждой ветвящейся структуры, чтобы вы знали, какая из них самая длинная.
3) как только у вас будут все ваши листовые узлы, распределите их поровну по концентрической окружности. Вы можете использовать либо весь круг, либо только некоторую часть области углов.
4) как только все листовые узлы были решены, вы снова проходите по дереву, проходя снаружи внутрь. Каждый встреченный вами узел, который не является листовым, нуждается в компоновке. По сути, каждый узел с этого момента имеет угол, который является средним значением всех его дочерних узлов, а смещение представляет собой graph_radius * (deep_of_node / maximum_depth)
Я обнаружил, что это дает мне очень приличный и понятный человеку дистрибутив, хотя и не очень эффективный с точки зрения использования экрана. Я загрузил анимацию моего дерева здесь: GIF anim