建立一个四叉树

时间:2010-03-24 20:27:58

标签: tree traversal quadtree

我正在尝试使用四叉树(4-ary树)来保存给定BMP中的信息。
我正在努力弄清楚如何在给定任何BMP的情况下构建树。

基本上,结构是每个叶子代表一个像素。每个节点有4个指针,每个指针指向图像中其余四个象限中的一个。因此,每个节点将当前图片分成4个部分。当你在叶子时,你处于一个特定的像素。

我不确定如何构建树来映射某个图像。假设图像的维度是2的幂,我该怎么办。我知道递归函数可能最优雅地做到这一点,但我正在努力弄清楚如何跟踪图像中的哪个位置。

这是在C ++中,目前我的quadtree.h文件包含一个Node * root,其中一个节点被定义为一个带有像素元素和4个指向其他节点的结构。每个内部节点(非叶节点)应该保持它所导致的所有4个RGB值的平均值。

我正在尝试制作算法,但我想我可能需要在.h文件中包含一个或两个结构。是否有更好/更干净的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

好吧,根据您存储Bitmap数据的方式,您可能会采取不同的方式。你是从文件中读取它并将其直接放入树中吗?如果是这样,.BMP文件(如果我没记错的话)告诉你它们的宽度和高度就在顶部,所以你实际上可以用它来确定你将拥有多少级别,这可能有助于你构建一些东西。

此外,根据图像的大小,您可以将所有像素存储在2D节点阵列中,并让树类“坐在”数组的顶部,这样您的树叶就在阵列中别的在别处。如果你这样做,你可以写一些嵌套的循环,它们会通过并抓住四个节点的组,计算它们的平均值,并将它们混合在一起,然后对它刚刚创建的节点做同样的事情。这可能比从上到下构建树更快,因为你永远不会平均超过四个像素,而从上到下构建每个步骤需要平均超过四个像素,除了最后一个。

如果您不想在数组中执行此操作,我认为最简单的方法是让每个节点跟踪其x,y坐标。这将允许您基本上与数组相同,但您不只是插入索引。

这有用吗?你是如何存储位图的?最终目标是什么?

答案 1 :(得分:1)

STANN是目前最好的开源实现。

http://sites.google.com/a/compgeom.com/stann/

明智的话,使用Bern等人的四叉树构造算法并放弃时髦的树操作。

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.33.4634&rep=rep1&type=pdf

  1. 按照按揭顺序对所有点进行排序。
  2. 计算每对连续点之间的四叉树框长度。
  3. 执行所有最近的最大值计算以查找父母/兄弟姐妹。
  4. 我正在为OpenCl开发一个库。一旦我完成测试,我会发布一个链接。