如何找到位于定义表面内的细胞/体素部分?

计算科学 计算几何 有限体积 一体化 麻木的 几何学
2021-12-17 07:46:04

我们有一个体素(或细胞)的 3 维网格,单个体素的体积为,其中dxdydzdx=dy=dz=1

锥状表面由某个函数定义,,在这种情况下具体为(其中是常数):z=f(x,y)ϵw0r0

z=(x2+y2w02r02ϵ)12ϵ

在整个网格中,如何计算每个体素的体积在该锥形表面所包围的体积内的比例?

显然,值的范围应为,在这种特殊情况下,位于较大值和较小值的体素在锥体内没有体积,而位于较大值和较小值的体素完全被锥形表面包围。01xyzzxy

1个回答

该功能看起来表现良好/流畅。因此,假设您的体素与表面曲率相比非常小,我认为您可以通过测试表面上的 8 个角来采用类似符号距离的方法。这将迅速消除所有角内 (1) 和所有角外 (0) 的情况。

在表面附近会有跨越体素,对此测试尚无定论(角是内部和外部的混合)。对于这些,您将递归,将它们(在 3D 中)分成八个子体素,然后对结果求和。当然,其中一些子体素仍会跨越,因此再次递归,可能达到某个固定/最大递归深度。如果一个子体素仍然在递归的叶子处一直向下跨越,放弃并将其称为 0.5。

这基本上类似于二分搜索以查找函数的根,但在 3D 中查找曲面的“根”。

这可能有点慢/不准确(有点取决于你有多少体素以及你选择什么样的递归深度),但它看起来很容易实现,而不需要引入大量的计算几何。一个可能的改进是引入一些计算几何,并通过将表面的局部切平面切割成多面体来近似叶子体素的体积,然后计算其体积(可能通过将其分解为四面体,它有一个简单的体积公式)。但只有在我第一次实现后对更简单的方法不满意时,我才会这样做。