c – 我在哪里存储八度的形状?

到目前为止设计决策的一点背景…我开发了一个可以存储点的八叉树结构.我选择基于一定的基本体素大小限制“世代”的递归.子节点仅在将点添加到该节点时创建.这不是一个动态图形应用程序 – 这个八叉树和其中的对象是静态的,所以预处理以提高性能不是一个问题.

现在,我想向我的八叉树添加“形状” – 具体来说,是由三角形组成的表面网格.这些三角形的顶点不对应于存储在八叉树中的点.如何在八叉树中存储这些形状?我看到两个选项…

灰色节点为“空”,因为它们没有形状.在替代方案1中,形状存储在它们相交的每个节点中,即,节点1a包含形状1和4c& 4d分享形状2.在替代方案2中,形状仅存储在它们相交的最小节点中,节点1a包含shape1,节点4包含shape2.

我看过的八倍的大多数帖子都假设Alt1,但是他们从来没有解释为什么. Alt2对我来说更有意义,只会为驻留在节点边界上的那些形状创建额外的工作.为什么Alt1更好?

编辑:为了澄清,我使用的实现语言是C,所以我更喜欢该语言的示例实现,但问题是与语言无关.抱歉,如果标签使用不正确

编辑2:虽然与形状存储问题没有直接关系,但this link对八叉树遍历问题进行了很好的讨论.我以为可能会帮助任何有兴趣在这个问题上工作的人.

解决方法

ALT1是正确的假设您要限制节点中最大对象数(三角形),则需要对包含许多三角形的节点进行细分.这不可避免地导致在多个节点中具有单个三角形,除非您要细分三角形,以便它们完美地适合八叉树节点(这取决于您的应用程序,我通常不会推荐,例如,对于光线跟踪确实通常不会完成) .

作为一个反例,想象一下ALT2包含斯坦福兔子的详细模型,站在一个大三角形上.大三角形可以防止将根节点细分为子节点,因此您的八叉树就好像没有八​​叉树一样好.

或者,您必须保留根节点中的大三角形,并将其细分为包含其余小兔子三角形的子节点.三角形不仅在叶节点中,而且在其他节点中也可能使八叉树遍历复杂化(但也取决于您的应用程序).如果我们坚持使用光线追踪方案,要找到最近的光线和三角形交叉点,则必须检查节点和所有子节点,以便找到最接近的交点,并且您必须跟踪光线的移动到下一个节点,同时在所有树级上.另一方面,如果几何仅在叶子中,则按照光线访问它们的顺序测试叶子中的三角形(同时跟踪已经测试的三角形,以避免测试相同的三角形).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...