游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1269|回复: 0

看了本站译文四叉树后的一些小问题

[复制链接]

6

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2005-3-10 15:02:00 | 显示全部楼层 |阅读模式
今天开始学习四叉树,开始看了本网站的一篇关于4叉树的介绍文章,地址:
http://dev.gameres.com/Program/Visual/3D/Roam/Quadtrees.htm

有点不解~~~
公式一: (Grid Width*Grid Width)/Leaf Width
给出公式1后,一段关于公式的描述,有点让我费解.
译文:
上面的公式给出了叶节点的数目,叶宽指的是每个叶的三角形数目,这里我们称叶节点为单元,QUADTREE就如同一个节点的数组,也可以说每个单元包含16个三角形,那么这里的叶宽为4个三角形,Grid Width指的是格子的宽度,由于每个单元有4个三角形,Grid Width为16个单元乘以4是64。

如上描述的含义为:叶节点就是叶子,叶子就是单元,每个单元是16个三角形,根据第一句话的定义:叶宽就是指每个叶的三角形数目。那里这里的叶宽为4个三角形又是何来呢?

有些迷惑后,我决定去翻看原文。
原文:
The above formula gives us the number of leaves. The Leaf Width is the number of triangles across in each leaf. As we said each leaf will be one cell by one cell, we also said each cell contains 16 triangles. In our case, seeing as cells are 16x16 triangles, the Leaf Width will be 4. Grid Width is the width of the grid in triangles. As each cell is 4 triangles across, 16 cells x 4 is 64.
在这里叶宽的定义和译文有些不同The Leaf Width is the number of triangles across in each leaf.
在介词in前的那个across是什么意思?穿过?怎么穿?(我猜是横着穿过)

|/|/|  
|/|/|
|/|/|
|/|/|

这是一个cell,横着穿过时的三角形数量为4个这就是leaf width,接下来这句seeing as cells are 16x16 triangles。又实在是看不懂了!
我的假设代入公式1,又是不对的。
如有以下的结构
|/|/| |/|/|  
|/|/| |/|/|
|/|/| |/|/|
|/|/| |/|/|

|/|/| |/|/|
|/|/| |/|/|
|/|/| |/|/|
|/|/| |/|/|
很简单的结构就是个树高为2的四叉树,leaf width=4,grid width=8,叶子数应该是4,但是代入公式1中却得到8*8/4=16?
文中的例子,leaf width = 4,grid width = 64,代入公式1中为1024,明显的叶子数应该是256吧。
我觉得公式1是不是应该为(gridwidth*gridwidth)/(leafwidth*leafwidth)
这样上面的结果都能正确~~~

继续往下看:
文章的下面给出了一个求出总节点的函数。
该函数传入了叶子数和叶宽。
在下面的函数说明中,看来作者主动承认了错误
unsigned int Temp =(GridWidth/4)*(GridWidth/4);           //颠覆了公式1哦
unsigned int Temp2 = CalcNodeNum(Temp,4);
pNodeList = (NODE*)malloc(sizeof(NODE)*Temp2);
计算节点的公式如下:
unsigned int CalcNodeNum(unsigned int max,unsigned int min)
{
  int ctr=0;
  int var = 0;

  while(var==0)
  {
    ctr+=max;
    max=max/min;

    if(max==1)
      {var=1;}
  }
  ctr++;

  return ctr;
}
具体的意思就是,用ctr来进行层次化累加,第一次是所有叶节点的数量,第二次是叶节点父辈的数量,等等直到根节点为1中止。
在四叉树(满四叉树)中,从下一层推算父辈节点数应该是除以4,而函数中使用的除数是leaf width,这就对leafwidth的概念有了新的变化,叶宽似乎是应该指每个节点下的最大孩子数量??(继续郁闷)

初次接触4叉树,问题多多,还请指教。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 18:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表