- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很难掌握如何迭代八叉树或四边形。这可能是因为我没有经历过不同的迭代神话。但是让我们假设我生成了一个包含 float x,y,z 的四叉树;双字颜色。现在,我们还假设这个节点一次只能产生 4 个 child (并且这些 child 都可以产生 4 个 child ,等等)直到: 达到 7 个级别(这样 child 就不能再创建 child 了,但是它的兄弟/姐妹可以),创建的所有 4 个 child 都是相同的双字颜色(同样,如果发生这种情况,它的兄弟/姐妹仍然可以生产),或者创建的节点总数等于 87380。当发生上述情况时,它被放入容器。这个过程还在继续。
现在这个包含节点的容器(例如)有 7 层深,所有子节点的子节点的所有子节点的 x、y、zs 和颜色都不同。我遇到的问题是我如何迭代这个容器,我怎么遍历所有的 child ,姐妹们?因为根导致 4 个 child ,而这 4 个 child 有 4 个 child ,等等,等等:4^1+4^2....+4^7。我怎样才能找到我想要的节点,而不用编写复杂的 if 语句,并遍历整个节点(从根开始)?容器(生成节点的容器)是否需要额外的代码来简化此过程?
抱歉,如果问题太笼统。
最佳答案
遍历整棵树很容易,您可以递归地进行。
void iterate(node *n) {
// do something with n
if (n->child1 != NULL) iterate(n->child1);
if (n->child2 != NULL) iterate(n->child2);
if (n->child3 != NULL) iterate(n->child3);
if (n->child4 != NULL) iterate(n->child4);
}
然后调用 iterate(root)
并且 do something
将在四叉树中的每个节点上发生。
不过,我怀疑这并不是您真正要问的。如果这就是您所做的一切,那么将您的数据保存在四叉树中是没有意义的。如果您想找到四叉树中的特定节点,那么您还需要其他东西。假设您想在四叉树中找到一个点 x,y
。然后你做这样的事情:
void find(node *n, float x, float y) {
if (x == n->x && y == n->y) // you've found it!
if (x < n->x) {
if (y < n->y) {
if (n->child1 != NULL) {
find(n->child1, x, y);
} else {
// point not in quadtree
}
} else {
...same, but child2
}
} else {
...same, child3 & 4
}
}
请注意,四叉树通常不会在它们自己存储的点上进行拆分,它们通常通过将拆分坐标与点(仅存储在四叉树的叶子上)分开存储来进行拆分。查看wikipedia picture举个例子。
关于c++ - 如何迭代 Quad/Oct 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11488413/
注意:此问题已从其原始形式进行了彻底编辑 我正在尝试通过实现与体素化相结合的八叉树数据结构来创建对数光线追踪器,以实现快速光线追踪。 目前我在光线碰撞检测方面遇到问题。 预期的输出应该是带有法线贴图的
编写一个应用程序,输入一个由用户提供的 5 位数字组成的数字,将该数字分隔成单独的数字,并打印这些数字,每个数字之间用三个空格分隔。例如,如果用户输入数字 12345,程序应打印 1 2 3
在 Octave .oct 文件中,可以这样提取子矩阵: B = A.extract(a-1,c-1,b-1,d-1) ; 相当于 Octave 代码中的 B = A(a:b,c:d),但是否可以用类
这主要针对Octave的用户。 在 Octave 的 c++ API 文档中,其中一个示例是将两个矩阵相加的函数,如下所示: */addtwomatrices.cc #include DEFUN_D
我有一个 (OCT) 图像,如下所示(原始)。如您所见,它主要有 2 层。我想生成一个图像(如第 3 张图所示),其中红线表示第 1 层的顶部边界,绿色表示第 2 层最亮的部分。 我试图简单地对图像进
HEX: 复制代码 代码如下: #include <iostream.h> #include <iomanip.H> main(void) {
我需要实现输入日期(例如 2014 年 9 月、2014 年 10 月、2014 年 11 月等)是否为当前月份的逻辑。我已经编写了以下逻辑,用于使用以下方法检查所选周是否为当前周,但无法在当前月份实
我正在尝试编写一个使用 linasm-1.13 library 的 Octave C++ .oct 函数但我似乎无法从/usr/share/zoneinfo/获得基本的 tzdata 加载来工作。到目
我正在使用通过包控制下载的 sublime text 3 和 SCSS 编译器。拥有之后: &:before{ content: "“"; } 它将我的内容替换为: content: "ÔÇť"; 有
不确定这是系统问题还是版本问题,但是在调用嵌入式 oct() 函数时我缺少预期的八进制前缀?这是我的例子 # Base conversion operations print 'x = 1234 '
考虑在 C++ Octave 函数中创建 3 维数组 NDArray 的问题。 我有一个双指针 double* ptr 和来自 Armadillo cube 的维度 int dim[3]。我找到了一个
我很难掌握如何迭代八叉树或四边形。这可能是因为我没有经历过不同的迭代神话。但是让我们假设我生成了一个包含 float x,y,z 的四叉树;双字颜色。现在,我们还假设这个节点一次只能产生 4 个 ch
我有一个脚本可以解析一个大文本文件,提取某些值(使用 line.split),并将它们存储在一个文本文件中。我在将八进制值保存到文件时无法解释时遇到问题。 当我手动指定 oct 字符的 string
这个问题在这里已经有了答案: How to get 3 letter abbreviation for month in SQL (3 个答案) 关闭 5 年前。 我目前正在处理一个如下所示的表格:
这可能是个愚蠢的问题。 当我尝试构建一些方法时,例如 “有效地八进制到十进制”,我被提醒有文字可以完成这项工作。这将是最快的、按位的、内置的系统方式。 对于八进制,前缀为“0”。 对于十六进制,前缀为
编辑:这是我目前拥有的用于生成患者 Oct 元组的代码。(感谢 Anon 告诉我如何计算加权概率/设置种子) fun genPatients(x:int) = let val seed=let val
例如我有以下号码: 0x FF 00 FF 现在,我希望 00 部分只有在它为 0 时才为 1。我是否需要检查每个字节,或者是否有可以在这里使用的位技巧? 示例: 我有一个无符号长 IP,我用字符串函
原理 十进制转n进制都可以使用倒除法:对十进制进行除n的运算,直到商为0为止,然后将各个步骤中得到的余数倒着写出来. n进制转十进制:(例子:二进制转十进制) 101001 => 2^5 +
#include #include using namespace std; int main() { // int t = 0b11011101; strings
我正在尝试查询 MYSQL 数据库以返回包含今天日期的所有记录 - SELECT * FROM credit_application created_on = '15-OCT-15'; 但由于查询中的
我是一名优秀的程序员,十分优秀!