点到三角形的最短距离Golang版
话不多说直接上代码
思路:对三条边分别求到点的最短距离,取最小值
两种情况:
- 点到三角形的最短距离是点到某条边的垂直距离:此时点到边的垂直交点位于边上,此时分别计算点到三条边的最短距离,取最小值即为结果
- 点到三角形的最短距离是点到某个点的直线距离:此时点到边的垂直交点不位于边上,因此需要判断点与边的交点是否在边上,不在时,分别计算点到三角形三个顶点的最短距离,取最小值即为结果
package main
import (
"fmt"
"math"
)
func calculateDistance(point []float64, triangle [][]float64) float64 {
getDistanceByPointToPoint := func(a,b []float64)float64{
res := math.Sqrt(math.Pow(math.Abs(a[0]-b[0]), 2) + math.Pow(math.Abs(a[1]-b[1]), 2))
return res
}
getDistanceByPointToLine := func(line [][]float64) float64 {
a := line[0]
b := line[1]
t := []float64{0, 0}
if a[0] == b[0] {
// 平行于x轴,point所在直线垂直于y轴,斜率应为0
t[0] = a[0]
t[1] = point[1]
} else if a[1] == b[1] {
t[0] = point[0]
t[1] = a[1]
} else {
k2 := -1 * (b[0] - a[0]) / (b[1] - a[1])
k1 := -1 / k2
b1 := a[1] - k1*a[0]
b2 := point[1] - k2*point[0]
t[0] = (b2 - b1) / (k1 - k2)
t[1] = t[0]*k1 + b1
}
dis := getDistanceByPointToPoint(a,b)
var res float64
if getDistanceByPointToPoint(t,a)<=dis&&getDistanceByPointToPoint(t,b)<=dis {
res = getDistanceByPointToPoint(t,point)
}else{
res = getDistanceByPointToPoint(a,point)
}
return res
}
res := math.MaxFloat64
for i := 0; i < 3; i++ {
line := [][]float64{}
line = append(line, triangle[(i)%3])
line = append(line, triangle[(i+1)%3])
dis := getDistanceByPointToLine(line)
res = math.Min(res, dis)
}
return res
}
func main() {
point := []float64{10, 10}
triangle := [][]float64{{0, 1}, {1, -1}, {-1, -1}}
distance := calculateDistance(point, triangle)
fmt.Println(distance)
}
需要其他语言代码可评论如果我会的话