如题
计算点到线上的垂点,首先明确:
该线段必须给出确切的起始点和终点, 而不是一个向量,因为一个向量并不能代表一个线段。
所以参数列表如下:
Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd);
下图中蓝色标记的是未知量,黑色为已知量
数学方法求解:
- 因为
point
,LStart
,LEnd
都已知,
所以向量vector = LEnd- LStart
,guideLine = point - LStart
都已知
首先由向量的点积公式可知
v e c t o r ⋅ g u i d e L i n e = ∣ v e c t o r ∣ ∣ g u i d e L i n e ∣ c o s θ vector ·guideLine = |vector||guideLine|cosθ vector⋅guideLine=∣vector∣∣guideLine∣cosθ - 又因为需要的是点到线段上的垂点
且由直角三角形的定义可知
我们可以求得|target - LStart|
长度,
即|guideLine| * cosθ
由此即可得到目标点相对LStart
的偏移量 - 由向量性质可知
向量归一化后其长度为一,所以我们可以将vector
向量转化为单位向量
因为|vector.normalize| == 1
,所以当vector = vector.normalize
,则|vector| == 1
此时我们的公式就化为了:
v e c t o r . n o r m a l i z e ⋅ g u i d e L i n e = ∣ g u i d e L i n e ∣ c o s θ vector.normalize ·guideLine = |guideLine|cosθ vector.normalize⋅guideLine=∣guideLine∣cosθ
接着:
∣ t a r g e t − L S t a r t ∣ = ∣ g u i d e L i n e ∣ c o s θ = v e c t o r . n o r m a l i z e ⋅ g u i d e L i n e = 偏移量 |target - LStart| = |guideLine|cosθ = vector.normalize · guideLine = 偏移量 ∣target−LStart∣=∣guideLine∣cosθ=vector.normalize⋅guideLine=偏移量
此时vector.normalize
和guideLine
均可知
所以target = LStart + vector * 偏移量
C#代码
public static Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd)
{Vector3 guideLine = point - lStart;Vector3 vector = lEnd - lStart;//float magnitude = vector.magnitude; vector = vector.normalized;float num2 = Vector3.Dot(vector, guideLine);//有需要的话可以将值限制在范围之间,比如这里限制在 线段内部//float num2 = Mathf.Clamp(Vector3.Dot(vector, guideLine), 0f, magnitude); return lStart + (vector * num2);
}