значение обновляется медленно и с небольшим значением при выполнении внутренней навигации по маяку в быстром - PullRequest
0 голосов
/ 30 сентября 2019

Я использую алгоритм трилатерации для нахождения точного положения устройства с этим кодом, упомянутым ниже. Также я беру это значение и отображаю его на виде. Но при этом значения меняются только на 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
    }

Может кто-нибудь сказать, действует ли то же самое, или есть какая-то проблема с моим кодом

...