【发布时间】:2015-04-16 16:31:02
【问题描述】:
我在使用 iBeacon 进行三边测量时遇到了一些麻烦。我在this 线程中找到了一个使用向量数学的公式,并在我的项目中实现了它。然而,它似乎给了我奇数。
它似乎在大多数情况下都有效,但是我注意到有时它会在使用截然不同的距离时给出非常相似的答案,这对我来说似乎很奇怪。
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),(我得到的两组输入的答案)距离点 (40, 612) 13.5 个单位,那么同一个点怎么可能也是 349.9 个单位?
我不确定我的数学哪里出了问题,但我认为计算 x 和 y 是问题所在。我发现“pow(distanceA, 2) - pow(distanceB, 2)" 和 "pow(distanceA, 2) - pow(distanceC, 2)" 对两组数字给出了大致相同的答案,这就是为什么无论我使用哪一组数字,x 和 y 最终都是相同的.
我不认为应该是这种情况,任何帮助将不胜感激,谢谢!
【问题讨论】:
-
你能举出一些输入和输出的例子,这些输入和输出给你“奇怪”的结果,你认为它们应该是什么?
-
@davidgyoung 我将输入和输出的值作为 cmets 放在相应的代码行旁边。答案的 y 值似乎比我预期的要大得多。
-
如果
distanceA是你和信标A之间的距离(和另一个相同),如果你尝试从你的finalPoint和信标A的位置再次计算它,你不要检索相同的。公式可能是错误的,或者您的代码翻译可能是错误的。至少在第一组距离上,但这似乎很正常,因为“圆圈”没有相交。 -
加上第二组距离,效果完美。
标签: objective-c ibeacon