我正在尝试构建一个表示最初由CSG(构造实体几何)树描述的体积的八叉树。
我最初的计划是从包含整个物体的大立方体开始,然后测试八个子立方体中的每一个,哪些完全在外面,完全在物体内部,并且在内部和外。这些“中间”立方体将以递归方式进行细分。
我的问题可能是愚蠢的,但我无法设法找到立方体的交集 CSG对象,能够按上述方式对多维数据集进行分类。
我的CSG结构是由原始元素构建的,例如立方体,球体和圆柱体(以及未来可能是环形),使用联合,交叉和减法的布尔运算。
除了CSG的显式树结构之外,我还有一种距离函数d(x,y,z)
可以告诉我点(x,y,z)
是在外(> 0)还是在内( < 0)对象。
如何找到一个立方体是否与CSG结构描述的对象相交?
答案 0 :(得分:1)
听起来有点像你正试图重新发明稀疏的体素八叉树。
我的想法是以你想要考虑的最好的立方体分辨率取样(无论如何你必须有一个分辨率截止)。
在位于Z-Order曲线(也称为Morton顺序)上的点上对距离函数进行采样,并在每次距离函数改变符号时记下坐标。请注意,基于Z阶曲线的属性,所需的存储空间应相对于表面积而不是体积渐近地缩放。
这个结构在功能上等同于一个离散的八叉树(所以你可以想象它原样使用它)因为Morton排序相当于八叉树的深度优先遍历。
但关键是,通过这种结构,您可以使用二进制搜索立方角的Mortonized坐标来有效地测试八叉树立方体交叉点。注意这样做时,可以使用2个坐标描述八叉树对齐的立方体。我们将有一个"更低的"和#34;鞋帮"相对于莫顿阶的立方角,一个立方体是有趣的"当且仅当间隔(lower,upper]
有任何符号变化时,以抽样分辨率(不完全为空或满)。只要您选择原始采样分辨率足够精细以使单个CSG基元完全不适合您的最小网格线,您就不会错过任何功能。
明确地找到与立方体边界的交叉点稍微复杂一些,但是相当可行。在我的记忆中,你必须考虑在立方体边界发生的符号变化,并考虑表面边界与立方体边界重合的特殊情况(也可能发生在完全完整的立方体上)。我将它作为练习留给读者,因为我暂时没有计算出数学。我只是想试着帮助你更进一步。