Intro
快速行进算法用来高效求解程函方程(Eikonal Equation) F∥∇U∥=1F\Vert\nabla U\Vert = 1F∥∇U∥=1, F为速度场函数( Velocity Field Function). 符号距离函数为这个方程的近似解,当F=1F = 1F=1时,二维情况下F(x,y)=1F(x, y) = 1F(x,y)=1, 三维情况下F(x,y,z)=1F(x, y, z) = 1F(x,y,z)=1. 该方程为非线性偏微分方程,一般用数值方法也即有限差分来进行求解,其一阶有限差分近似为
(max(Δ−xU,−Δ+xU,0))2+(max(Δ−yU,−Δ+yU,0))2=1/F(\text{max}(\Delta_{-x}U, -\Delta_{+x}U, 0))^2 + (\text{max}(\Delta_{-y}U, -\Delta_{+y}U, 0))^2 = 1 / F(max(Δ−xU,−Δ+xU,0))2+(max(Δ−yU,−Δ+yU,0))2=1/F
这个有限差分如何得到可以参考Osher或Sethian的著作。
三维情况下方程左侧再添加一项对zzz的差分。
Derive solution
大多数博客只讨论了二维情况,对三维的考虑都是基于mesh,由于我这次做的项目使用的三维网格(or Voxel),以小立方体为单位。具体的解的推导有点不一样,但大部分类似。
考虑网格点i,j,ki, j, ki,j,k, 设Ux=min(Ui−1,j,k,Ui+1,j,k),Uy=min(Ui,j−1,k,Ui,j+1,k),Uz=min(Ui,j,k−1,Ui,j,k+1)U^x = \text{min}(U_{i - 1, j, k}, U_{i+1, j, k}), U^y = \text{min}(U_{i, j - 1, k}, U_{i, j + 1, k}), U^z = \text{min}(U_{i, j, k-1}, U_{i, j, k+1})Ux=min(Ui−1,j,k,Ui+1,j,k),Uy=min(Ui,j−1,k,Ui,j+1,k),Uz=min(Ui,j,k−1,Ui,j,k+1)。
分以下几种情况考虑
- U>Ux,Uy,UzU > U^x, U^y, U^zU>Ux,Uy,Uz, 即 U>max(Ux,Uy,Uz)=UxU>\text{max}(U^x, U^y, U^z)=U^xU>max(Ux,U