Swift 点到线段的最短距离

Swift 点到线段的最短距离,swift,line,cgpoint,Swift,Line,Cgpoint,我一直在尝试在我的代码中实现,我能够将伪代码转换为Swift,除了最短距离的分段函数。我能找到的唯一快速版本得到了回答,但我不明白这到底是怎么回事 我需要一个函数,该函数获取三个点作为参数(点和线的两端),并返回点和线段之间的最短距离。关于代码的作用(以及原因)的一些解释很好,但不是必需的。回答w/variables重命名&添加了一些注释: /* Distance from a point (p1) to line l1 l2 */ func distanceFromPoint(p: CGPoi

我一直在尝试在我的代码中实现,我能够将伪代码转换为Swift,除了最短距离的分段函数。我能找到的唯一快速版本得到了回答,但我不明白这到底是怎么回事

我需要一个函数,该函数获取三个点作为参数(点和线的两端),并返回点和线段之间的最短距离。关于代码的作用(以及原因)的一些解释很好,但不是必需的。

回答w/variables重命名&添加了一些注释:

/* Distance from a point (p1) to line l1 l2 */
func distanceFromPoint(p: CGPoint, toLineSegment v: CGPoint, and w: CGPoint) -> CGFloat {
    let pv_dx = p.x - v.x
    let pv_dy = p.y - v.y
    let wv_dx = w.x - v.x
    let wv_dy = w.y - v.y

    let dot = pv_dx * wv_dx + pv_dy * wv_dy
    let len_sq = wv_dx * wv_dx + wv_dy * wv_dy
    let param = dot / len_sq

    var int_x, int_y: CGFloat /* intersection of normal to vw that goes through p */

    if param < 0 || (v.x == w.x && v.y == w.y) {
        int_x = v.x
        int_y = v.y
    } else if param > 1 {
        int_x = w.x
        int_y = w.y
    } else {
        int_x = v.x + param * wv_dx
        int_y = v.y + param * wv_dy
    }

    /* Components of normal */
    let dx = p.x - int_x
    let dy = p.y - int_y

    return sqrt(dx * dx + dy * dy)
}
/*从点(p1)到线l1的距离*/
func distanceFromPoint(p:CGPoint、ToLine段v:CGPoint和w:CGPoint)->CGFloat{
设pv_dx=p.x-v.x
设pv_dy=p.y-v.y
设wv_dx=w.x-v.x
设wv_dy=w.y-v.y
设点=pv_dx*wv_dx+pv_dy*wv_dy
设len_sq=wv_dx*wv_dx+wv_dy*wv_dy
设参数=dot/len_sq
var int_x,int_y:CGFloat/*通过p的法线与vw的交点*/
如果参数<0 | |(v.x==w.x&&v.y==w.y){
int_x=v.x
int_y=v.y
}否则,如果参数>1{
int_x=w.x
int_y=w.y
}否则{
int_x=v.x+参数*wv_dx
int_y=v.y+param*wv_dy
}
/*正态分布的分量*/
设dx=p.x-int_x
设dy=p.y-int\y
返回sqrt(dx*dx+dy*dy)
}

您从另一个源代码引用的代码,因此答案有很好的文档记录;你不明白吗?所以你希望有人帮你做?试试看yourself@ScottHunter我发现像A、B、C、D、xx和yy这样的变量名很难理解,所以我必须承认,即使它可以工作,我也不理解代码。@lascort我想看看它在Swift中是如何工作的,是的。并且也解释了。