查找由封闭的3D曲面切割的3D单元的体积分数

时间:2015-09-21 23:16:05

标签: geometry computational-geometry geometry-surface

我有一个3D三角形封闭表面。该表面浸没在矩形笛卡尔网格内。表面以STL格式存储。我的目标是计算由表面切割的细胞部分。换句话说,当一个单元与表面有交叉并且实际上被它切割时,它被分成内部和外部子单元。我的目标是找到内部亚细胞的体积分数和表面切割的细胞。例如,在下面的图片中显示了用于说明目的的2D情况,我想计算青色区域到总面积的分数(青色+灰色)。

enter image description here

有人可以帮我找到一个可以做到这一点的有效方法/算法吗?我可以在MATLABC中执行。

3 个答案:

答案 0 :(得分:1)

确切方法

首先考虑将表面与由平面界定的半空间相交。

有些三角形完全位于半空间内并保持不变。其他一些人完全在外面并被丢弃。其余的被切成两半,给出一个三角形和一个四边形。保留正确的部分并在必要时对四边形进行三角测量。

您还需要将生成的面视为位于曲面内的平面区域。为此,获取所有新边(由平面三角形截面产生的边),并将它们链接起来。我的意思是将具有共同顶点的段连接在一起(注意数值精度);最后,你将有一个或多个循环,形成简单的多边形。对这些多边形进行三角测量(例如通过耳朵裁剪方法)。

通过此过程,您将获得一个描述所请求交叉点的新三角曲面。重复定义单元格的六个平面,然后获得单元格与表面中包含的体积之间的交集。

要计算其体积,您可以将每个三角形形成的棱镜的体积与其在固定平面上的投影相加;确保以代数方式计算这些卷(带符号)。

这是一个2D类比。 “新边缘”为绿色。 enter image description here

由于此过程非常耗时,如果您需要为整个网格的每个单元重复此过程将会很昂贵。您可以通过保持中间结果并逐片工作来简化计算。

在垂直于第一个平面的方向上的排序将加速外部三角形的拒绝。

答案 1 :(得分:0)

除了Yves Daoust的答案中的确切解决方案,如果一个近似的解决方案是可以接受的,要有一些合理有效的东西,我会" rasterize"将表面转换为更高清晰度的网格,并计算每个宏单元中微小区的分数。 To" rasterize"表面上,如果需要性能,我会使用GPU [1](但很痛苦)。如果性能不是真正的问题,那么你可以循环每个三角形,然后对于落在三角形边界框中的每个微单元,测试它是否与三角形有交点。最后,洪水填充了卷的内部。

[1] https://developer.nvidia.com/content/basics-gpu-voxelization

答案 2 :(得分:0)

我相信你需要通过PLIC方法重建流体界面体积。以下是VOF研究界普遍遵循的步骤{ref:Rider,W。J.,& Kothe,D.B。(1998)。重建音量跟踪。计算物理学杂志,141(2),112-152。}。

步骤1:将等式写入/开发到接口。在PLIC中,我写了形式ax +的接口+ + c = 0.如果您更喜欢二次/样条方程,那就这样做。

步骤2:获取所有网格点的坐标。例如:如果你想开发一个x = 1:5和y = 1:5的网格,那么使用以下

x = 1:5;
y = 1:5; 
[X,Y] = meshgrid(x,y);

**步骤3:设置公差值(我用10 ^ -7)来定义界面内/外/上的区域。

对于流体/液体域内的所有点(X,Y):

a*X+b*Y+c >tol

流体/液体域外的所有点(X,Y)

a*X+b*Y+c <-tol

界面上的要点:

[-tol<=(a*X+b*Y+c)<=tol]