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