S01E01:点到直线的最近点(垂足)

1,448 阅读1分钟

说明

直线定义采用点+向量形式,与射线相同,起点+方向,确定一条直线。

如果直线是由两个点坐标确定的,也可以利用两点坐标相减算出方向向量,进而进行计算。

求点到直线的最近点,也就是求点到直线的垂线的垂足。

几何

如图,点A,直线 BC。 求垂线需要借助向量 BA,即从 B 指向 A 的向量。将 BA 分解到 BC 方向上,就得到了最近点的坐标。 而求 BA 向量在 BC 方向上的投影长,我们可以借助点乘来完成。只要将 BC 向量变为单位向量,点乘的结果就是投影长。 再将 BC 单位向量乘以投影长,就得到了投影向量。

然后将点 B 沿投影向量移动到 D,就得到了 A 在直线 BC 上的投影点(最近点)D。

代码

//定义直线
struct Line {
    var position = simd_float3.zero
    var direction = simd_float3.zero
}
static func projectionOnLine(from point:simd_float3, to line:Line) -> simd_float3 {
    let vector = point - line.position
    let normalizedDirection = normalize(line.direction)
    let dotValue = dot(vector, normalizedDirection)
    let tarPoint = line.position + dotValue * normalizedDirection
    return tarPoint
}

其他

得到点在直线上的垂足,即最近点之后,就能很轻松求得点到直线的距离,判断点是否在直线上,等等。算法虽然简单,但非常有用。

项目代码

本系列文章代码已发布在 github:ComputationalGeometrySwift