【发布时间】:2020-02-27 01:08:13
【问题描述】:
使用这个答案here 中的算法,我能够创建一个径向树,其中的点代表每个节点。问题是子节点没有以父节点为中心并且有些偏移。我在上面的答案中看到了类似的问题,但即使在实施之后,它似乎也没有让孩子们集中注意力。我翻译错了吗?我对 C++ 的所有细节都不太熟悉,但我已经走到了这一步。
我以前问过question,与此有关,但不是同一个问题。解决此问题后,我想更新答案,以便其他人知道该怎么做。
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)
【问题讨论】: