水平集和符号距离函数
零水平集
定义: 对于一个函数 ϕ ( x ⃗ ) : R n → R \phi(\vec x):{\mathbf{R}^n}\rightarrow \mathbf{R} ϕ(x ):Rn→R(其中 x ⃗ ∈ R n \vec x \in {\mathbf{R}^n} x ∈Rn ,下同),取其值域为零部分对应的定义域:
Γ = { x ⃗ ∣ ϕ ( x ⃗ ) = 0 } (1) \Gamma = \{ \vec x|\phi (\vec x) = 0\} \tag{1} Γ={x ∣ϕ(x )=0}(1)
这里,
Γ
∈
R
n
−
1
\Gamma \in {\mathbf{R}^{n-1}}
Γ∈Rn−1 称为函数
ϕ
\phi
ϕ 的零水平集,反之,
ϕ
\phi
ϕ 称为
Γ
\Gamma
Γ 的一个水平集函数。
通俗地说,函数的水平集是这个函数在某个高度上所有点的一个集合。
函数的零水平集有一些良好的性质,在如下图所示的曲面演化问题中,
n ⃗ \vec n n 为外法线向量, Γ \Gamma Γ 为演化曲线。我们不妨假设有函数 ϕ ( x ⃗ ) \phi(\vec x) ϕ(x ),它的零水平集为 Γ \Gamma Γ ,并且满足,
{ ϕ > 0 x ⃗ ∈ Γ i n ϕ < 0 x ⃗ ∈ Γ o u t (inandout) \left\{ \begin{aligned}\tag{inandout} &\phi > 0&&\vec x \in {\Gamma_{in}}\\ &\phi < 0&&\vec x \in {\Gamma_{out}}\\ \end{aligned} \right. {ϕ>0ϕ<0x ∈Γinx ∈Γout(inandout)
这里, Γ i n \Gamma_{in} Γin 表示 Γ \Gamma Γ 内部, Γ o u t \Gamma_{out} Γout 表示 Γ \Gamma Γ 外部。那么,对于任意的 x ⃗ ∈ Γ \vec x \in \Gamma x ∈Γ , ϕ \phi ϕ 有如下两个性质:
-
性质一: ∇ ϕ ∣ ∇ ϕ ∣ = − n ⃗ (zlsp1) \tag{zlsp1} \frac{{\nabla \phi }}{{|\nabla \phi |}} = - \vec n ∣∇ϕ∣∇ϕ=−n (zlsp1)
Proof. 如图所示,设 s ⃗ \vec s s 为零水平集 Γ \Gamma Γ 的切线方向, ϕ \phi ϕ 在 Γ \Gamma Γ 沿切线方向上恒为零,故有:
∂ ϕ ∂ s = 0 \frac{{\partial \phi }}{{\partial s}} = 0 ∂s∂ϕ=0 由链式法则,可得:
ϕ s ( x ⃗ ) = ∇ ϕ ⋅ x ⃗ s = 0 {\phi _s}(\vec x) = \nabla \phi \cdot {{\vec x}_s} = 0 ϕs(x )=∇ϕ⋅x s=0
由此可知 ∇ ϕ \nabla \phi ∇ϕ 与切向垂直,对 ∇ ϕ \nabla \phi ∇ϕ 进行单位化并根据 ϕ \phi ϕ 内正外负的情况取符号,即得:
∇ ϕ ∣ ∇ ϕ ∣ = − n ⃗ \frac{{\nabla \phi }}{{|\nabla \phi |}} = - \vec n ∣∇ϕ∣∇ϕ=−n -
性质二: d i v ( ∇ ϕ ∣ ∇ ϕ ∣ ) = − trace ( ∇ ⋅ n ⃗ ) = − κ (zlsp2) \tag{zlsp2} {\rm{div}}(\frac{{\nabla \phi }}{{|\nabla \phi |}}) = -\text{trace} (\nabla\cdot \vec n) = -\kappa div(∣∇ϕ∣∇ϕ)=−trace(∇⋅n )=−κ(zlsp2)
Proof.
ϕ s \phi_s ϕs 在 Γ \Gamma Γ 沿切线方向上恒为零,故有: ϕ s s = 0 \phi_{ss}=0 ϕss=0 ,由链式法则,可知:
ϕ s s ( x ⃗ ) = ∂ ∂ s ( ∇ ϕ ⋅ x ⃗ s ) = ∂ ∂ s ∇ ϕ ⋅ x ⃗ s + ∇ ϕ ⋅ x ⃗ s s {\phi _{ss}}(\vec x) = \frac{\partial }{{\partial s}}(\nabla \phi \cdot {{\vec x}_s}) = \frac{\partial }{{\partial s}}\nabla \phi \cdot {{\vec x}_s} + \nabla \phi \cdot {{\vec x}_{ss}} ϕss(x )=∂s∂(∇ϕ⋅x s)=∂s∂∇ϕ⋅x s+∇ϕ⋅x ss
由曲率的定义,有 x ⃗ s s = − κ n ⃗ \vec x_{ss}=-\kappa \vec n x ss=−κn ,由上一个性质,有 ∇ ϕ ⋅ n ⃗ = − ∣ ∇ ϕ ∣ \nabla \phi \cdot \vec n = -|\nabla \phi| ∇ϕ⋅n =−∣∇ϕ∣ ,代入上式,移项,可得:
− κ ∣ ∇ ϕ ∣ = ∂ ∂ s ∇ ϕ ⋅ x ⃗ s - \kappa |\nabla \phi | = \frac{\partial }{{\partial s}}\nabla \phi \cdot {{\vec x}_s} −κ∣∇ϕ∣=∂s∂∇ϕ⋅x s
将其左端展开,即证。
性质二本质上就是曲率的定义。因为曲率是 Weingarten Map ∇ n ⃗ = ∇ 2 d \nabla \vec n=\nabla^2 d ∇n =∇2d 对角线上的元素。这里的 d d d 提前说了,它表示距离函数。另外,Weingarten Map 和 n ⃗ \vec n n 也是垂直的,即 ∇ 2 d ∇ d = 0 \nabla^2 d \nabla d=0 ∇2d∇d=0。
符号距离函数
符号距离函数 (Signed Distance Function) 是一个水平集函数,它给定了点到某条曲线上距离这个点最近点的距离,也可以说是这个点离曲线的最短距离,它在数学上可以这样表述:
在某区域上给定一条曲线
Γ
\Gamma
Γ ,定义与之相关的函数:
d
(
Γ
,
x
⃗
)
=
{
min
y
⃗
∈
Γ
∣
x
⃗
−
y
⃗
∣
x
⃗
∈
Γ
i
n
−
min
y
⃗
∈
Γ
∣
x
⃗
−
y
⃗
∣
x
⃗
∉
Γ
i
n
d(\Gamma,\vec x)= \left\{ \begin{aligned} \mathop {\min }\limits_{\vec y \in \Gamma } |\vec x - \vec y| & & &\vec x \in \Gamma_{in}\\ -\mathop {\min }\limits_{\vec y \in \Gamma } |\vec x - \vec y|& & &\vec x \notin \Gamma_{in}\\ \end{aligned} \right.
d(Γ,x
)=⎩⎪⎨⎪⎧y
∈Γmin∣x
−y
∣−y
∈Γmin∣x
−y
∣x
∈Γinx
∈/Γin
Γ
i
n
\Gamma_{in}
Γin 指
Γ
\Gamma
Γ 内部,二维情况下,
x
⃗
∈
R
2
,
y
⃗
∈
R
2
\vec x \in \mathbf{R}^2 \text{,} \vec y\in \mathbf{R}^2
x
∈R2,y
∈R2 ,那么称
d
d
d 为一个符号距离函数,下面把符号距离函数也简称为 SDF 。
符号距离函数有很多良好的性质,包括在边界上的几乎处处可微,关于凸区域的凸性,以及不同符号距离函数之间和差运算的一些性质,作为重点,列以下两条关于单位法向量和平均曲率的性质:
-
对于任意的 x ⃗ ∈ Γ \vec x \in \Gamma x ∈Γ ∣ ∇ d ∣ = 1 (sdfp1) \tag{sdfp1} |\nabla d| = 1 ∣∇d∣=1(sdfp1) 这也是符号距离函数的一个判断条件,它是充要的。
-
对于任意的 x ⃗ ∈ Γ \vec x \in \Gamma x ∈Γ ,由水平集函数的性质可得:
∇ d = − n ⃗ ⋅ ∣ ∇ d ∣ = − n ⃗ Δ d = − κ ∣ ∇ d ∣ = − κ (sdfp2) \tag{sdfp2} \begin{aligned} &\nabla d = - \vec n \cdot |\nabla d|=-\vec n &\\ &\Delta d = - \kappa |\nabla d| = - \kappa & \end{aligned} ∇d=−n ⋅∣∇d∣=−n Δd=−κ∣∇d∣=−κ(sdfp2)
第二条的拉普拉斯算子 Δ d \Delta d Δd,本质上就是 d d d 的 Hessian ∇ 2 d \nabla^2 d ∇2d 对角线上的元素,即曲率。