【发布时间】:2023-01-13 02:54:32
【问题描述】:
MKMapView - 我有一条路,由许多定位点组成。 从每个点到下一个点绘制一条线,使其成为一条可见的道路线。
我有一个用户位置,我想画一条线到那条路的最近点。
这意味着 - 我需要迭代每两个点,并确定离用户位置最近的点。
一切正常,但问题是 - 计算出的直线上的最近点有时并不直接与所述直线成 90 度角。 (在某些情况下,角度几乎是 45 度)。
看来这取决于线的角度。
请看示例视频: https://imgur.com/a/27QFmHx
(或视频截图:)
在这个可见的例子中,绘制了 3 条黑色静态线,其中两条是垂直的(右边的)。
红线 - 即时计算,绘制在用户位置(地图中心)与每条线上最近点之间。
可见,顶线是直的(没有角度),找到的最近点,它画的线是垂直的。
但是正确的黑线存在问题。找到的点(和红线)显然不是 90 度。
这是我正在使用的代码,用于确定直线上的最近点:
func distanceBetweenTwoPointsFrom(origin: CLLocationCoordinate2D, pointOne: CLLocationCoordinate2D, pointTwo: CLLocationCoordinate2D) -> CLLocationCoordinate2D {
let A: Double = origin.latitude - pointOne.latitude
let B: Double = origin.longitude - pointOne.longitude
let C: Double = pointTwo.latitude - pointOne.latitude
let D: Double = pointTwo.longitude - pointOne.longitude
let dot: Double = A * C + B * D
let len_sq: Double = C * C + D * D
var param: Double = -1
if len_sq != 0 {
param = dot / len_sq
}
var xx: Double = 0
var yy: Double = 0
if param < 0 || (pointOne.latitude == pointTwo.latitude && pointOne.longitude == pointTwo.longitude) {
xx = pointOne.latitude
yy = pointOne.longitude
} else if param > 1 {
xx = pointTwo.latitude
yy = pointTwo.longitude
} else {
xx = pointOne.latitude + param * C
yy = pointOne.longitude + param * D
}
return CLLocationCoordinate2D.init(latitude: xx, longitude: yy)
}
问题:如何修复,使黑线上找到的点与用户成90度角? (显然是从用户位置到所述线的最直线)
【问题讨论】:
-
Swift Talk 团队前段时间有一个关于这个的系列,也许你可以在那里找到一些灵感:talk.objc.io/collections/map-routing