2017-10-06 60 views
0

我目前正在玩分区2D空间。我如何穿过一个有多个孩子的树?

Tree with Rectangles

这是我的树

private class TreeNode 
    { 
     public Rectangle region; 
     public TreeNode childQ1; 
     public TreeNode childQ2; 
     public TreeNode childQ3; 
     public TreeNode childQ4; 

     public TreeNode(Rectangle region) 
     { 
      this.region = region; 
     } 
    } 

这是我如何partioning的树,我调试它,一切都看起来不错

public class RegionTree 
{ 
    private class TreeNode 
    { 
     public Rectangle region; 
     public TreeNode childQ1; 
     public TreeNode childQ2; 
     public TreeNode childQ3; 
     public TreeNode childQ4; 

     public TreeNode(Rectangle region) 
     { 
      this.region = region; 
     } 
    } 

    TreeNode root; 

    public RegionTree(int RegionWidth, int RegionHeight, byte depth) 
    { 
     root = new TreeNode(new Rectangle(0, 0, RegionWidth, RegionHeight)); 
     GenerateNodes(root, depth); 
    } 

    private void GenerateNodes(TreeNode node, int depth) 
    { 
     for (int i = 0; i < depth; i++) 
     { 
      int halfWidth = node.region.Width/2; 
      int halfHeight = node.region.Height/2; 

      TreeNode childQ1 = new TreeNode(new Rectangle(node.region.X, node.region.Y, halfWidth, halfHeight)); 
      node.childQ1 = childQ1; 
      TreeNode childQ2 = new TreeNode(new Rectangle(node.region.X + halfWidth, node.region.Y, halfWidth, halfHeight)); 
      node.childQ2 = childQ2; 
      TreeNode childQ3 = new TreeNode(new Rectangle(node.region.X, node.region.Y + halfHeight, halfWidth, halfHeight)); 
      node.childQ3 = childQ3; 
      TreeNode childQ4 = new TreeNode(new Rectangle(node.region.X + halfWidth, node.region.Y + halfHeight, halfWidth, halfHeight)); 
      node.childQ4 = childQ4; 

      GenerateNodes(childQ1, i); 
      GenerateNodes(childQ2, i); 
      GenerateNodes(childQ3, i); 
      GenerateNodes(childQ4, i); 
     } 
    } 
} 

我想要走线槽全部节点和子节点和绘制矩形,但需要一些帮助。

回答

0

首先,来看看四树生成时,生成器中的循环重新创建子节点对象并丢弃生成的对象。因此,对于迭代0,创建4个新对象和随后的子对象。对于迭代1,这些对象将被新对象覆盖,而以前的值将被垃圾收集。你想要做的是开始:

private void GenerateNodes(TreeNode node, int depth) 
    { 
     if(depth < 0) return; 
     int halfWidth = node.region.Width/2; 
     int halfHeight = node.region.Height/2; 

     TreeNode childQ1 = new TreeNode(new Rectangle(node.region.X, node.region.Y, halfWidth, halfHeight)); 
     node.childQ1 = childQ1; 
     TreeNode childQ2 = new TreeNode(new Rectangle(node.region.X + halfWidth, node.region.Y, halfWidth, halfHeight)); 
     node.childQ2 = childQ2; 
     TreeNode childQ3 = new TreeNode(new Rectangle(node.region.X, node.region.Y + halfHeight, halfWidth, halfHeight)); 
     node.childQ3 = childQ3; 
     TreeNode childQ4 = new TreeNode(new Rectangle(node.region.X + halfWidth, node.region.Y + halfHeight, halfWidth, halfHeight)); 
     node.childQ4 = childQ4; 

     GenerateNodes(childQ1, depth - 1); 
     GenerateNodes(childQ2, depth - 1); 
     GenerateNodes(childQ3, depth - 1); 
     GenerateNodes(childQ4, depth - 1); 
    } 
} 

好吧,现在我们有一个工作的发电机,走这些叶子的方式使用类似的代码。您可以以不同的方式走它们,具体取决于您要打印的顺序。

private void WalkNodes(TreeNode node) 
    { 
     if(node == null) return; 
     //do something here will write root tracing to the left, 
     //which will draw your rectangles from the outside in, 
     //finishing each bottom left before starting the next 
     WalkNodes(node.childQ1); 
     WalkNodes(node.childQ2); 
     WalkNodes(node.childQ3); 
     WalkNodes(node.childQ4); 
     //do something here to traverse the tree from the last 
     //leaf back to the first, which will draw your rectangles 
     //from the inside to out, finishing the right upper first 
    } 
} 
+0

非常感谢你,完美的作品! – SKSKSKS

相关问题