我们有一个体素(或细胞)的 3 维网格,单个体素的体积为,其中。
锥状表面由某个函数定义,,在这种情况下具体为(其中、和是常数):
在整个网格中,如何计算每个体素的体积在该锥形表面所包围的体积内的比例?
显然,值的范围应为,在这种特殊情况下,位于较大和值和较小值的体素在锥体内没有体积,而位于较大值和较小值的体素的和完全被锥形表面包围。
我们有一个体素(或细胞)的 3 维网格,单个体素的体积为,其中。
锥状表面由某个函数定义,,在这种情况下具体为(其中、和是常数):
在整个网格中,如何计算每个体素的体积在该锥形表面所包围的体积内的比例?
显然,值的范围应为,在这种特殊情况下,位于较大和值和较小值的体素在锥体内没有体积,而位于较大值和较小值的体素的和完全被锥形表面包围。
该功能看起来表现良好/流畅。因此,假设您的体素与表面曲率相比非常小,我认为您可以通过测试表面上的 8 个角来采用类似符号距离的方法。这将迅速消除所有角内 (1) 和所有角外 (0) 的情况。
在表面附近会有跨越体素,对此测试尚无定论(角是内部和外部的混合)。对于这些,您将递归,将它们(在 3D 中)分成八个子体素,然后对结果求和。当然,其中一些子体素仍会跨越,因此再次递归,可能达到某个固定/最大递归深度。如果一个子体素仍然在递归的叶子处一直向下跨越,放弃并将其称为 0.5。
这基本上类似于二分搜索以查找函数的根,但在 3D 中查找曲面的“根”。
这可能有点慢/不准确(有点取决于你有多少体素以及你选择什么样的递归深度),但它看起来很容易实现,而不需要引入大量的计算几何。一个可能的改进是引入一些计算几何,并通过将表面的局部切平面切割成多面体来近似叶子体素的体积,然后计算其体积(可能通过将其分解为四面体,它有一个简单的体积公式)。但只有在我第一次实现后对更简单的方法不满意时,我才会这样做。