Я использую алгоритм трилатерации для нахождения точного положения устройства с этим кодом, упомянутым ниже. Также я беру это значение и отображаю его на виде. Но при этом значения меняются только на 1 или 2 балла при перемещении устройства.
func Trilateration(point1: MapCoordinate, point2: MapCoordinate, point3: MapCoordinate, r1: Double, r2:Double, r3: Double) -> MapCoordinate {
// Unit vector in a direction from point1 to point 2
let p1p2:Double = pow(pow(point2.x! - point1.x! , 2.0) + pow(point2.y! - point1.y!, 2.0), 0.5)
let ex = MapCoordinate(xx: (point2.x! - point1.x!) / p1p2, yy: (point2.y! - point1.y!) / p1p2)
let aux = MapCoordinate(xx: point3.x! - point1.x!, yy: point3.y! - point1.y!)
//Signed magnitude of the x component
let i: Double = ((ex.x)! * (aux.x)!) + ((ex.y)! * aux.y!)
//The unit vector in the y direction.
let aux2 = MapCoordinate(xx: point3.x! - point1.x! - (i * (ex.x)!), yy: point3.y! - point1.y! - (i * (ex.y)!))
let ey = MapCoordinate(xx: (aux2.x!) / self.normValue(point: aux2), yy: (aux2.y!) / self.normValue(point: aux2))
//The signed magnitude of the y component
let j:Double = ((ey.x)! * (aux.x)!) + ((ey.y)! * (aux.y)!)
//Coordinates
let x:Double = (pow(r1, 2) - pow(r2, 2) + pow(p1p2, 2)) / (2 * p1p2)
let y:Double = ((pow(r1, 2) - pow(r3, 2) + pow(i, 2) + pow(j, 2))/(2 * j)) - (i * x/j)
//Result coordinates
let finalX:Double = point1.x! + x * ex.x! + y * (ey.x)!
let finalY:Double = point1.y! + x * ex.y! + y * (ey.y)!
let location = MapCoordinate(xx: finalX, yy: finalY)
iclosetThreeBeacon.removeAll()
if iTrilaterationState == true {
if let handler = iLoadIndoorMapdhandler
{
handler(location)
}
iTrilaterationState = false
}
//Sending data to a another view
let userInfo:[String: MapCoordinate] = [ "text" : location ]
NotificationCenter.default.post(name: Notification.Name("MapLocationUpdater"), object: nil, userInfo: userInfo)
return location
}
Может кто-нибудь сказать, действует ли то же самое, или есть какая-то проблема с моим кодом