shadertoy sdSegment 原理
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