sdSegment 原理
float sdSegment( in vec2 p, in vec2 a, in vec2 b )
{
vec2 pa = p-a, ba = b-a;
float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
return length( pa - ba*h );
}
原理:
u
⃗
\vec{u}
u 在
v
⃗
\vec{v}
v 在夹角是
θ
\theta
θ 的投影长度是:
|
F
⃗
|
=
∣
u
⃗
∣
c
o
s
θ
|\vec{F}| = |\vec{u}| cos \theta
|F|=∣u∣cosθ
结合点乘公式:
u
⃗
⋅
v
⃗
=
∣
u
⃗
∣
∣
v
⃗
∣
c
o
s
θ
\vec{u} \cdot \vec{v} = |\vec{u}| |\vec{v}| cos \theta
u⋅v=∣u∣∣v∣cosθ
投影长度可以写成:
|
F
⃗
|
=
u
⃗
⋅
v
⃗
∣
v
⃗
∣
|\vec{F}| = \frac{\vec{u} \cdot \vec{v}}{|\vec{v}|}
|F|=∣v∣u⋅v
因为
F
⃗
\vec{F}
F 和
v
⃗
\vec{v}
v 方向相同, 只是长度不同。那么投影长度占向量
v
⃗
\vec{v}
v长度的比例:
h
=
u
⃗
⋅
v
⃗
∣
v
⃗
∣
2
=
u
⃗
⋅
v
⃗
v
⃗
⋅
v
⃗
\begin{aligned} h &= \frac{\vec{u} \cdot \vec{v}}{|\vec{v}|^2} \\ &= \frac{\vec{u} \cdot \vec{v}}{\vec{v} \cdot \vec{v}} \end{aligned}
h=∣v∣2u⋅v=v⋅vu⋅v