private void CalculateInitialX(SpellButton node, int nodeSize, int siblingDistance, int treeDistance) { foreach (var child in node.Children) { CalculateInitialX(child, nodeSize, siblingDistance, treeDistance); } // if no children if (node.IsLeaf()) { // if there is a previous sibling in this set, set X to prevous sibling + designated distance if (!node.IsLeftMost()) { node.X = node.GetPreviousSibling().X + nodeSize + siblingDistance; } else { // if this is the first node in a set, set X to 0 node.X = 0; } } // if there is only one child else if (node.Children.Count == 1) { // if this is the first node in a set, set it's X value equal to it's child's X value if (node.IsLeftMost()) { node.X = node.Children[0].X; } else { node.X = node.GetPreviousSibling().X + nodeSize + siblingDistance; node.Mod = node.X - node.Children[0].X; } } else { var leftChild = node.GetLeftMostChild(); var rightChild = node.GetRightMostChild(); var mid = (leftChild.X + rightChild.X) / 2; if (node.IsLeftMost()) { node.X = mid; } else { node.X = node.GetPreviousSibling().X + nodeSize + siblingDistance; node.Mod = node.X - mid; } } if (node.Children.Count > 0 && !node.IsLeftMost()) { // Since subtrees can overlap, check for conflicts and shift tree right if needed CheckForConflicts(node, treeDistance, nodeSize); } }
private void CalculateInitialX(SpellButton node, int nodeSize, int siblingDistance, int treeDistance) { foreach (var child in node.Children) CalculateInitialX(child, nodeSize, siblingDistance, treeDistance); // if no children if (node.IsLeaf()) { // if there is a previous sibling in this set, set X to prevous sibling + designated distance if (!node.IsLeftMost()) node.X = node.GetPreviousSibling().X + nodeSize + siblingDistance; else // if this is the first node in a set, set X to 0 node.X = 0; } // if there is only one child else if (node.Children.Count == 1) { // if this is the first node in a set, set it's X value equal to it's child's X value if (node.IsLeftMost()) { node.X = node.Children[0].X; } else { node.X = node.GetPreviousSibling().X + nodeSize + siblingDistance; node.Mod = node.X - node.Children[0].X; } } else { var leftChild = node.GetLeftMostChild(); var rightChild = node.GetRightMostChild(); var mid = (leftChild.X + rightChild.X) / 2; if (node.IsLeftMost()) { node.X = mid; } else { node.X = node.GetPreviousSibling().X + nodeSize + siblingDistance; node.Mod = node.X - mid; } } if (node.Children.Count > 0 && !node.IsLeftMost()) { // Since subtrees can overlap, check for conflicts and shift tree right if needed CheckForConflicts(node, treeDistance, nodeSize); } }