码迷,mamicode.com
首页 > 其他好文 > 详细

box2d dynamic tree

时间:2015-06-20 20:44:49      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

box2d dynamic tree
dynamic tree 是一颗 full binary trees,  即非叶子节点必须有两个子节点(注:full binary trees和大学老师讲的满二叉树,完全二叉树不同)
 
那么如果构建树?先看源码
 
 while (m_nodes[index].IsLeaf() == false)
 {
  int32 child1 = m_nodes[index].child1;
  int32 child2 = m_nodes[index].child2;

  float32 area = m_nodes[index].aabb.GetPerimeter();
  // 面积代价

  b2AABB combinedAABB;
  combinedAABB.Combine(m_nodes[index].aabb, leafAABB);
  float32 combinedArea = combinedAABB.GetPerimeter();
  // 合并后的 周长

  // Cost of creating a new parent for this node and the new leaf
  float32 cost = 2.0f * combinedArea;

  // Minimum cost of pushing the leaf further down the tree
  float32 inheritanceCost = 2.0f * (combinedArea - area);

  // Cost of descending into child1
  float32 cost1;
  if (m_nodes[child1].IsLeaf())
  {
   b2AABB aabb;
   aabb.Combine(leafAABB, m_nodes[child1].aabb);
   cost1 = aabb.GetPerimeter() + inheritanceCost;
  }
  else
  {
   b2AABB aabb;
   aabb.Combine(leafAABB, m_nodes[child1].aabb);
   float32 oldArea = m_nodes[child1].aabb.GetPerimeter();
   float32 newArea = aabb.GetPerimeter();
   cost1 = (newArea - oldArea) + inheritanceCost;
  }

  // Cost of descending into child2
  float32 cost2;
  if (m_nodes[child2].IsLeaf())
  {
   b2AABB aabb;
   aabb.Combine(leafAABB, m_nodes[child2].aabb);
   cost2 = aabb.GetPerimeter() + inheritanceCost;
  }
  else
  {
   b2AABB aabb;
   aabb.Combine(leafAABB, m_nodes[child2].aabb);
   float32 oldArea = m_nodes[child2].aabb.GetPerimeter();
   float32 newArea = aabb.GetPerimeter();
   cost2 = newArea - oldArea + inheritanceCost;
  }

  // Descend according to the minimum cost.
  if (cost < cost1 && cost < cost2)
  {
   break;
  }

  // Descend
  if (cost1 < cost2)
  {
   index = child1;
  }
  else
  {
   index = child2;
  }
 }

  box2d是采用surface area heuristic 划分场景的。 虽然采用的是getperimter, 获取aabb的周长,然后计算代价。 但可以从变量名上可以找到area, totalarea,  newarea,oldarea. 这可能是因为采用周长的代价更低的原因。

    插入思路如下:计算左右子树的代价,选择代价低的节点,如果此节点是叶子节点,将新节点插入。 如果不是,重复此步操作。

 

 技术分享
 

box2d dynamic tree

标签:

原文地址:http://www.cnblogs.com/duzib/p/4590900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!