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

前端之家收集整理的这篇文章主要介绍了c – 我在哪里存储八度的形状?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
到目前为止设计决策的一点背景…我开发了一个可以存储点的八叉树结构.我选择基于一定的基本体素大小限制“世代”的递归.子节点仅在将点添加到该节点时创建.这不是一个动态图形应用程序 – 这个八叉树和其中的对象是静态的,所以预处理以提高性能不是一个问题.

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

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

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

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

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

解决方法

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

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

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

猜你在找的C&C++相关文章