Я нашел этот ответ , который закодирован в C# для построения узлов в радиальном дереве и получил много информации. Проблема в том, что мне трудно читать C# и я не могу точно понять все, что происходит. Цель состоит в том, чтобы попытаться визуализировать радиальное дерево, как показано на рисунке ниже, в игру и динамически показывать и скрывать точки, основанные на прогрессе. Я вижу, что большинство радиальных деревьев используют networkx
или matplotlib
, но я не хочу раздувать игру пакетами, когда мне нужно только построить их, используя игровые движки x и y позиции. Затем я также попытался посмотреть по алгоритму, на который ссылается ответ, и получил еще больше информации, но мне не все ясно, поскольку я не знаю всех математических рассуждений в терминах python.
Мое дерево основано на anytree и распечатано, мои узлы отображаются в виде списка, каждый из которых является объектом Node с данными внутри.
for pre, fill, node in RenderTree(Node('1')):
if Depth > 0:
list_of_p_c.append((node.name, node.data['Parent']))
else:
list_of_p_c.append((1, 0))
Depth += 1
print list_of_p_c
>> [(1, 0), ("'1.1'", '1'), ("'1.2'", '1'), ("'1.2.1'", '1.2'), ("'1.2.2'", '1.2'), ("'1.2.3'", '1.2'),
("'1.2.3.1'", '1.2.3'), ("'1.2.3.2'", '1.2.3'), ("'1.2.3.2.1'", '1.2.3.2'), ("'1.2.3.2.2'", '1.2.3.2'),
("'1.3'", '1')]
---------------------------------------------------
РЕДАКТИРОВАТЬ 2
def RadialPositions(node, alfa=0, beta=2*math.pi, delta=0, RadialPoints=RadialPoint):
if node.is_root:
# (x,y)
node.positions = (0,0)
print "This Node is root, positions are {} ".format(node.positions)
def addpoint():
x = 0
y = 0
ParentPoint = None
depthOfNode = node.depth
theta = alfa
radius = math.pi + (delta * depthOfNode)
number_chuldrend_of_node = len(node.children)
# print "There are " + str(number_chuldrend_of_node) + " children " + "radius is " + "%s and depth is %s" % (radius, depthOfNode)
for child_node in node.children:
print "Children: %s" % len(child_node.children)
leaves = len(child_node.leaves)
def convert_theta(x):
print "Beta is %s" % beta, "Alpha is %s" % alfa
return x * (beta - alfa)
mi = theta + convert_theta(leaves)
x = radius * math.cos((theta + mi) / 2.0)
y = radius * math.sin((theta + mi) / 2.0)
child_node.positions = (x, y)
print child_node
if (len(child_node.children) > 0):
child_node.positions = (x, y)
RadialPositions(child_node, theta, mi)
theta = mi
Мне удалось дать каждому узлу позицию, а затем рекурсивно дать детям точку. В настоящее время, хотя положения x и y находятся на правильной глубине, они также имеют прямую линию. Я поставил результаты ниже. Когда до глубины 4, линия также, кажется, ставит некоторые точки на противоположной стороне. Я, скорее всего, что-то упускаю в данный момент, но не знаю, что это такое. Перевод с C# на Python, похоже, сработал хорошо, но я не понимаю некоторые моменты предыдущего ответа.