CGPoint 到线段的最短距离
Shortest distance from CGPoint to segment
我一直在尝试实现 Douglas-Peucker algorithm into my code and I'm able to translate pseudocode into Swift, except for the shortestDistanceToSegment function. Only Swift version I could find was answered here,但我不明白它的实际作用。
我需要一个函数,它获取三个点作为参数(点和线的两端)和 returns CGPoint 和线段之间的最短距离。关于代码做什么(以及为什么)的一些解释会很好但不是必需的。
来自 的答案,其中变量重命名并添加了一些注释:
/* 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)
}
我一直在尝试实现 Douglas-Peucker algorithm into my code and I'm able to translate pseudocode into Swift, except for the shortestDistanceToSegment function. Only Swift version I could find was answered here,但我不明白它的实际作用。
我需要一个函数,它获取三个点作为参数(点和线的两端)和 returns CGPoint 和线段之间的最短距离。关于代码做什么(以及为什么)的一些解释会很好但不是必需的。
来自 的答案,其中变量重命名并添加了一些注释:
/* 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)
}