iBeacon 箭头旋转
iBeacon Arrow Rotation
我正在开发 iOS 应用程序,我正在尝试旋转具有箭头图形的 UIImageView。我在房间中的位置作为 CGPoint,我想显示您需要前往另一个 CGPoint 的方向。如何生成两点之间的角度,并确保箭头指向正确的方向,以及旋转 UIImageView 的最佳方式是什么?
- (CGFloat) pointPairToBearingDegrees:(CGPoint)startingPoint secondPoint:(CGPoint) endingPoint
{
CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start
float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians
float bearingDegrees = bearingRadians * (180.0 / M_PI); // convert to degrees
bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + bearingDegrees)); // correct discontinuity
return bearingDegrees;
}
CGAffineTransform transform = CGAffineTransformMakeRotation([self pointPairToBearingDegrees:yourLocation secondPoint:CGPointMake(0, 0)]);
self.arrow.transform = transform;
问题是它只是让箭头乱跳而不是从我的位置指向原点(0,0) (yourLocation.x,yourLocation.y)
听起来您可能想要两台设备——一台发射设备,一台接收设备,并且您希望接收设备有一个指向广播设备的罗盘。这听起来很不错。
我会通过 Major 和 Minor 键将广播设备的经度和纬度作为字符串广播。
现在,你应该有两点——经纬度广播和接收设备。接收设备还有一个罗盘。
您现在可以使用此处的代码:Point to location using compass 来确定指向的方向。
请注意,为了使其正常工作,必须为两台设备打开蓝牙,并且必须在两台设备上打开应用程序,即使在广播设备上也是如此。
编辑
我假设随机点基本上是另一个正在传输的设备。我知道您只想感知信号的来源,但设备无法知道。蓝牙基于无线电波(即光),无法判断信号源来自哪个方向。要完成这项工作,您需要有两条信息:每个设备的位置,以及用于定位设备的参考点:
- 如果您假设接收设备始终指向北方,每个设备在 space 中的位置将为您提供设备之间的距离和方向
- 由于用户在使用 iPhone 时通常不会面向北方,因此您需要使用设备上的指南针来确定设备上箭头所指图片的方向。
要确定位置,您可以使用 GPS,但如果您谈论的是房间的位置,则需要尽可能精确。然后就可以用上面的link来判断方向了
请注意,有一个室内定位 SDK Indoor positioning on iOS with Core Location - not accurate?,但它似乎没有您希望的那么准确。
我正在开发 iOS 应用程序,我正在尝试旋转具有箭头图形的 UIImageView。我在房间中的位置作为 CGPoint,我想显示您需要前往另一个 CGPoint 的方向。如何生成两点之间的角度,并确保箭头指向正确的方向,以及旋转 UIImageView 的最佳方式是什么?
- (CGFloat) pointPairToBearingDegrees:(CGPoint)startingPoint secondPoint:(CGPoint) endingPoint
{
CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start
float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians
float bearingDegrees = bearingRadians * (180.0 / M_PI); // convert to degrees
bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + bearingDegrees)); // correct discontinuity
return bearingDegrees;
}
CGAffineTransform transform = CGAffineTransformMakeRotation([self pointPairToBearingDegrees:yourLocation secondPoint:CGPointMake(0, 0)]);
self.arrow.transform = transform;
问题是它只是让箭头乱跳而不是从我的位置指向原点(0,0) (yourLocation.x,yourLocation.y)
听起来您可能想要两台设备——一台发射设备,一台接收设备,并且您希望接收设备有一个指向广播设备的罗盘。这听起来很不错。
我会通过 Major 和 Minor 键将广播设备的经度和纬度作为字符串广播。
现在,你应该有两点——经纬度广播和接收设备。接收设备还有一个罗盘。
您现在可以使用此处的代码:Point to location using compass 来确定指向的方向。
请注意,为了使其正常工作,必须为两台设备打开蓝牙,并且必须在两台设备上打开应用程序,即使在广播设备上也是如此。
编辑
我假设随机点基本上是另一个正在传输的设备。我知道您只想感知信号的来源,但设备无法知道。蓝牙基于无线电波(即光),无法判断信号源来自哪个方向。要完成这项工作,您需要有两条信息:每个设备的位置,以及用于定位设备的参考点:
- 如果您假设接收设备始终指向北方,每个设备在 space 中的位置将为您提供设备之间的距离和方向
- 由于用户在使用 iPhone 时通常不会面向北方,因此您需要使用设备上的指南针来确定设备上箭头所指图片的方向。
要确定位置,您可以使用 GPS,但如果您谈论的是房间的位置,则需要尽可能精确。然后就可以用上面的link来判断方向了
请注意,有一个室内定位 SDK Indoor positioning on iOS with Core Location - not accurate?,但它似乎没有您希望的那么准确。