1.先构建零水平集(可能是轮廓表面)和窄带,如图中曲线。根据自定义的k值(k为窄带宽度) ,划分出窄带轮廓(图中黑点)【构建方法后面补充,我也没弄懂】
水平集在数学上以函数Φ(x,t)形式表明(下图中的公式代表着它的另一种实现形式),但在代码中无法求解隐式偏微分方程,所以将零水平集函数离散成格点。零水平集就变成点的集合,可以看成点连成的函数曲线。这里引入一个符号距离值(sdf)的概念,sdf的大小代表着该点距离零水平面的最短距离。零水平面上的点sdf=0,即Φ(xn,t)=0。这下概念就串联起来了,sdf就是水平集离散化的结果,所以在后续编写代码中,对水平集进行衍化,就是对零等值面上点sdf值进行数值计算。
2.确定观测点和边界点
首先说一下原因:
在衍化过程中,零等值面会随着时间和迭代逐渐变化。具体来说,零等值面(即水平集 Φ=0Φ=0 的位置)会根据自己设定的条件进行衍化,导致其形状和位置发生变化。衍化的过程是零等值面向窄带边缘变化,而不是窄带边界向零等值面衍化。在衍化的过程中,零等值面可能越过设定的窄带k值,此时就需要设定观测点和边界点。
我看了一些文献,感觉大家都倾向于将边界点设为观测点,这样就可以知道零水平面是否超过设定的边界了。
3.重新初始化
当固定的边界点(观测点)有一个sdf的值发生正负号改变时,代表着此时零水平面已经有部分越过了边界,此时需要对零水平面、窄带、边界点进行重新初始化,重新构建窄带水平集。
以此时(刚被观测到越过边界时)的零水平面作为新一轮(步骤1)的零水平面,步骤跳转到1,再进行重复衍化,直到达到设定的衍化次数或时间。