我在使用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最终都是相同的。
我不认为应该是这样的,任何帮助都会非常感谢,谢谢!
发布于 2015-04-24 13:00:08
我用一个示例(和难看的代码测试)尝试了您的代码。测试代码是这里。为了调试,我使用了XCode 6的"3D“新特性,查看超出屏幕界限的点和圆圈,因为我不想进行转换(重新调整平面,等等)。
主要问题(您的第一个示例测试(@[@(13.535637), @(46.931522), @(51.585461)];) )是,圆圈没有重叠。没有交叉口。所以你猜不出这个位置。如果您用中心pointA和radius distanceA绘制一个圆,并对点B和C进行绘制,则需要找到地理定位的交集,这在wiki相关关于链接问题的文章中得到了明确的说明。
我添加了一个“检查”方法,以确定它们是否正确地重叠,并使用“允许的错误”,因为我们正在用浮点数进行一些数学运算,并且可能会出现一些舍入问题。
检查方法包括重新计算finalPoint (找到的坐标)与每个点之间的距离。现在的问题是他们是否有很大的不同?从原来的。
https://stackoverflow.com/questions/29680828
复制相似问题