У меня проблемы с Trilateration с помощью iBeacon's. Я нашел формулу с использованием векторной математики в потоке this, и я реализовал ее в своем проекте. Однако, похоже, это дает мне странные цифры.iBeacon Trilateration - векторная математика
Кажется, что он работает большую часть времени, однако я заметил, что иногда это дает мне очень похожие ответы при использовании расстояний, которые значительно отличаются друг от друга, что кажется странным для меня.
CGPoint pointA = [[curBlufiPoints objectAtIndex:0] CGPointValue];
CGPoint pointB = [[curBlufiPoints objectAtIndex:1] CGPointValue];
CGPoint pointC = [[curBlufiPoints objectAtIndex:2] CGPointValue];
/*Point A = (40, 612)
Point B = (379, 788)
Point C = (0, 352)*/
float distanceA = [[distances objectAtIndex:0] floatValue];
float distanceB = [[distances objectAtIndex:1] floatValue];
float distanceC = [[distances objectAtIndex:2] floatValue];
/*distanceA = 13.535637
distanceB = 46.931522
distanceC = 51.585461
----OR----
distanceA = 349.9057;
distanceB = 352.84134;
distanceC = 353.37515;*/
CGPoint P2MinusP1 = CGPointMake(pointB.x - pointA.x, pointB.y - pointA.y);
CGPoint P3MinusP1 = CGPointMake(pointC.x - pointA.x, pointC.y - pointA.y);
CGFloat magP2MinusP1 = sqrt(pow((P2MinusP1.x), 2) + pow((P2MinusP1.y), 2));
CGPoint eX = CGPointMake(P2MinusP1.x/magP2MinusP1, P2MinusP1.y/magP2MinusP1);
CGFloat i = eX.x * P3MinusP1.x + eX.y * P3MinusP1.y;
CGPoint eXTimesI = CGPointMake(eX.x * i, eX.y * i);
CGPoint P3MinusP1MinusITimesEX = CGPointMake(P3MinusP1.x - eXTimesI.x, P3MinusP1.y - eXTimesI.y);
CGFloat magP3MinusP1MinusITimesEX = sqrt(pow(P3MinusP1MinusITimesEX.x, 2) + pow(P3MinusP1MinusITimesEX.y, 2));
CGPoint eY = CGPointMake(P3MinusP1MinusITimesEX.x/magP3MinusP1MinusITimesEX, P3MinusP1MinusITimesEX.y/magP3MinusP1MinusITimesEX);
CGFloat j = eY.x * P3MinusP1.x + eY.y * P3MinusP1.y;
CGFloat x = (pow(distanceA, 2) - pow(distanceB, 2) + pow(magP2MinusP1, 2))/(2 * magP2MinusP1);
CGFloat y = (pow(distanceA, 2) - pow(distanceC, 2) + pow(i, 2) + pow(j, 2))/(2 * j) - (i * x)/j;
CGPoint finalPoint = CGPointMake(pointA.x + x * eX.x + y * eY.x, pointA.y + x * eX.y + y * eY.y);
NSLog(@"%f %f %f %f", finalPoint.x, finalPoint.y);
//finalPoint.x = ~343
//finalPoint.y = ~437
Как видно из значений я комментировал в приведенном выше коде, когда я использую одни и те же точки, но разные расстояния я в конечном итоге с тем же результатом. Для меня не имеет смысла, как они могут обойти один и тот же ответ. Если точка (343, 437) (ответ, который я получаю для обоих наборов ввода), находится на расстоянии 13,5 единиц от точки (40, 612), как же она может быть равна 349,9 единицы?
Я не уверен, где моя математика пошла не так, но я думаю, что что-то о вычислении x и y - вот где проблемы. Я обнаружил, что строки «pow (distanceA, 2) - pow (distanceB , 2) "и" pow (distanceA, 2) - pow (distanceC, 2) "дают мне примерно одинаковый ответ для обоих наборов чисел, поэтому x и y в конечном итоге становятся одинаковыми независимо от того, какой набор чисел I использовать.
Я не думаю, что это должно быть так, любая помощь будет принята с благодарностью, спасибо!
Можете ли вы привести примеры входов и выходов, которые дают вам «нечетные» результаты, и что вы думаете, что они должны быть? – davidgyoung
@ davidgyoung Я вставляю значения входов и выходов в виде комментариев рядом с соответствующими строками кода. Значение y для ответа кажется намного большим, чем я ожидал. – shadowarcher
Если 'distanceA' - расстояние между вами и маяком A (и тем же самым с другим), если вы попытаетесь рассчитать его снова из вашего« finalPoint »и положения маяка A, вы не получите тот же самый , Формула может быть неправильной или ваш перевод кода может быть. По крайней мере, с первым набором расстояний, но это кажется нормальным, так как «круги» не пересекаются. – Larme