Используя алгоритм из этого ответа здесь Мне удалось создать радиальное дерево с точками, которые представляют каждый узел. Проблема в том, что дочерние узлы не центрированы на родительском и несколько смещены. Я видел, что в приведенном выше ответе была похожая проблема, но даже после ее реализации кажется, что дети не находятся в центре внимания. Я неправильно делаю перевод? Я не слишком знаком со всеми плюсами и минусами C ++, но я дошел до этого.
У меня есть предыдущий вопрос , который я задал, который связан с этим, но не тот же вопрос. Я хочу обновить ответ, как только это будет решено, чтобы другие могли знать, что делать.
from anytree import Node, RenderTree
import math
#Start setting positions from node, starting from root tree object.
def RadialPositions(node):
# Set root to x=0, y=0, if not already set.
if node.is_root:
node.positions = (0, 0)
#Number of children in current node
nChildren = len(node.children)
#Rotate child to above parent
def rotate_node(x, y, nangle):
nx = x * math.cos(nangle) - y * math.sin(nangle)
ny = x * math.sin(nangle) + y * math.cos(nangle)
return nx, ny
# For every child, set angle
for idx, child_node in enumerate(node.children, start=1):
#Adjust from parent degree
centerAdjust = 0
# If node has a parent, adujust to center
if node.parent:
centerAdjust = (-node.angleRange + node.angleRange / nChildren) / 2
##Set child node angle and max angle range
child_node.nodeAngle = node.nodeAngle + node.angleRange / nChildren * idx + centerAdjust
child_node.angleRange = node.angleRange / nChildren
#Set positions
x = rotate_node(40 * child_node.depth, 0, child_node.nodeAngle)[0]
y = rotate_node(40 * child_node.depth, 0, child_node.nodeAngle)[1]
child_node.positions = (3 * x, 3 * y)
# For each child of child, iterate same process
RadialPositions(child_node)