【算法】Marching Cubes

等值面

等值面是空间中的一张曲面,在该曲面上函数 F ( x , y , z ) F(x,y,z) F(xyz)的值等于某一给定值。准确地讲,是指在某一网格空间中,假若每一结点保存着三变量函数 F ( x , y , z ) F(x,y,z) F(xyz),而且网格单元在 x , y , z x,y,z xyz方向上的连续采样值为 F ( x , y , z ) F(x,y,z) F(xyz),则对于某一给定值 F i F_{i} Fi,等值面是由所有满足 S = { ( x , y , z ) ∣ F ( x , y , z ) = F i } S =\left \{ (x,y,z)|F(x,y,z) = F_{i}\right \} S={(x,y,z)F(x,y,z)=Fi}的曲线。

按照此严格定义下得到的等值面表达式如下:
F ( x , y , z ) = a 0 + a 1 x + a 2 y + a 3 z a 4 x y + a 5 y z + a 6 x z + a 7 x y z F(x,y,z)=a_{0}+a_{1}x+a_{2}y+a_{3}za_{4}xy+a_{5}yz+a_{6}xz+a_{7}xyz F(xyz)=a0+a1x+a2y+a3za4xy+a5yz+a6xz+a7xyz
可以看出等值面是三次代数曲面,提取过程复杂而且不利于显示。为了简化等值面的提取,W.ELorenson和H.E.CIine在1987年提取了一种等值面的简化提取方法,该方法首先找到等值面经过的六面体网格,求出该六面体与等值面的交点,将这些交点按照一定的拓扑连接关系连接起来,作为等值面在该六面体网格中的近似表示。

1. 找到等值面经过的六面体网格

前面我们提到过,我们有很多的已知采样点,并且知道这些点在空间中的空间场值,现在我们将空间分为很多个小格子,每个小格子都有8个顶点,我们通过计算8个顶点周围(范围与六面体的大小相关)的采样点,近似计算出8个顶点的空间场值(加权评价等方法)。我们就可以对六面体做以下分类,我们分析一下以下情况:

八个顶点都没有空间场值,0等值面不经过或者经过但是没有采样,我们没有办法进行近似,所以不处理。
八个顶点都有或部分有空间场值,当空间场值都是正值或者都是负值时,说明0等值面,不在六面体内。
当六面体内的的顶点的空间场值有正有负时,则说明有0等直面穿过六面体。我们需要从众多六面体内,筛选出这样的六面体。
在这里插入图片描述

2. 求六面体边与0等值面的交点

因为六面体有8个顶点,8个顶点的状态就有 2 8 = 256 2^8 = 256 28=256中分布状态,但是由于六面体是有对称性的,我们通过对称性,可以简化这些状态至15种状态。我们看一下15中状态:
在这里插入图片描述

Marching Cubes

(1)将原始数据经过预处理之后,读入特定的数组中;

(2)从网格数据体中提取一个单元体,成为当前单元体"同时获取该单元体的所有信息,例如8个顶点的值,坐标位置等;

(3)将当前单元体8个顶点的函数值与给定等值面值C进行比较,得到该单元体的状态表;

(4)根据当前单元体的状态表索引,找出与等值面相交的单元体棱边,并采用线性插值的方法,计算出各个交点的位置坐标;

(5)利用中心差分法,求出当前单元体8个顶点的法向量,在采用线性插值的方法,得到三角面片各个顶点的法向

(6)根据各个三角面片顶点的坐标,顶点法向量进行等值面图象的绘制.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值