点到三角形的最短距离Golang

点到三角形的最短距离Golang版

话不多说直接上代码

思路:对三条边分别求到点的最短距离,取最小值
两种情况

  1. 点到三角形的最短距离是点到某条边的垂直距离:此时点到边的垂直交点位于边上,此时分别计算点到三条边的最短距离,取最小值即为结果
  2. 点到三角形的最短距离是点到某个点的直线距离:此时点到边的垂直交点不位于边上,因此需要判断点与边的交点是否在边上,不在时,分别计算点到三角形三个顶点的最短距离,取最小值即为结果
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)
}

需要其他语言代码可评论如果我会的话

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值