首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iBeacon三值化-向量数学

iBeacon三值化-向量数学
EN

Stack Overflow用户
提问于 2015-04-16 16:31:02
回答 1查看 493关注 0票数 2

我在使用iBeacon的Trilateration方面遇到了一些麻烦,我在线程中找到了一个使用向量数学的公式,并在我的项目中实现了这个公式。然而,它似乎给了我奇数。

它似乎大部分时间都有效,但我注意到,有时它会给我非常相似的答案,当使用的距离是巨大的不同,这似乎对我来说很奇怪。

代码语言:javascript
复制
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最终都是相同的。

我不认为应该是这样的,任何帮助都会非常感谢,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-24 13:00:08

我用一个示例(和难看的代码测试)尝试了您的代码。测试代码是这里。为了调试,我使用了XCode 6的"3D“新特性,查看超出屏幕界限的点和圆圈,因为我不想进行转换(重新调整平面,等等)。

主要问题(您的第一个示例测试(@[@(13.535637), @(46.931522), @(51.585461)];) )是,圆圈没有重叠。没有交叉口。所以你猜不出这个位置。如果您用中心pointA和radius distanceA绘制一个圆,并对点B和C进行绘制,则需要找到地理定位的交集,这在wiki相关关于链接问题的文章中得到了明确的说明。

我添加了一个“检查”方法,以确定它们是否正确地重叠,并使用“允许的错误”,因为我们正在用浮点数进行一些数学运算,并且可能会出现一些舍入问题。

检查方法包括重新计算finalPoint (找到的坐标)与每个点之间的距离。现在的问题是他们是否有很大的不同?从原来的。

第一组距离截图

第二组距离截图

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29680828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档