swift - 从CGPoint到segment的最短距离

  显示原文与译文双语对照的内容
0 0

在我的代码中,我试图实现 douglas算法,我能够将伪代码转换为 Swift,除了shortestDistanceToSegment函数。 只有我能找到的快速版本才能在这里找到 ,但是我并不理解它是什么。

我需要一个函数,以获得三个点作为参数( 直线的端点和两端),并返回CGPoint和线段之间的最短距离。 关于( 为什么) 代码做什么的一些解释会很好但不必要。

时间: 原作者:

0 0

http://stackoverflow.com/a/27737081/535275/变量重命名&的答案添加了一些注释:


/* 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)
}

原作者:
...