Как построить изображение в виде радиального дерева только с использованием математики - PullRequest
2 голосов
/ 25 февраля 2020

Я нашел этот ответ , который закодирован в 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, похоже, сработал хорошо, но я не понимаю некоторые моменты предыдущего ответа.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...