我有一个代表一个简单旋钮的UIImageView
:它与立体声高保真无关,它代表了一种指南针:
我的目标如下:我希望指南针指向一个精确的方向,从设备的当前位置开始(它也必须更新:如果用户将设备转到别处,旋钮应相应地旋转)。 / p>
到目前为止我尝试了什么:
我有这个功能:
func getRadiansBearing()->Double{
// body of degreesToRadians: return degrees * M_PI / 180.0
// data[1]._lat and _lon contains my current position
let lat1 = degreesToRadians(data[1]._lat)
let lon1 = degreesToRadians(data[1]._lon)
// data[0]._lat and _lon contains the target position
let lat2 = degreesToRadians(data[0]._lat)
let lon2 = degreesToRadians(data[0]._lon)
let dLon = lon2 - lon1;
let y = sin(dLon)*cos(lat2)
let x = cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dLon)
var radiansBearing = atan2(y, x);
if(radiansBearing < 0.0)
{
radiansBearing = radiansBearing+2*M_PI
}
return radiansBearing
}
我用这种方式调用它,使用CoreLocation
框架:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
guard let location = locations.last else {
return;
}
// data is an array of structs
data[1]._lat = location.coordinate.latitude
data[1]._lon = location.coordinate.longitude
geoAngle = getRadiansBearing()
}
和
func locationManager(manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
let direction = -newHeading.trueHeading
let dir2 = degreesToRadians(direction)
UIView.animateWithDuration(2.0, animations: {
self.imgView.transform = CGAffineTransformMakeRotation((CGFloat(dir2) * CGFloat(M_PI) / 180) + CGFloat(self.geoAngle))
})
}
问题是,由于某种原因,旋钮转到一个(错误的)方向,然后停止工作。
你能帮帮我吗?任何提示表示赞赏! : - )P.S。:我发了很多相关的帖子,没有解决这个问题
答案 0 :(得分:0)
将纬度视为x,将经度视为y。
<强>先决条件:强>
我会告诉你如何计算朝向这个方向的角度。它如下!
- 获取当前位置和目的地位置的纬度和经度。
醇>
伪代码:
设,currentLocation =(lat,long)
设,destinationLocation =(lat,long)
angleTowardsDestination =?
- 计算Pythagorus定理的基数和斜边。
醇>
现在,
base =√((currentLocation.lat - destinationLocation.lat) 2 - (currentLocation.long - currentLocation.long) 2 )
hypotenuse =√((currentLocation.lat - destinationLocation.lat) 2 - (currentLocation.long - destinationLocation.long) 2 )
- 现在计算角度!
醇>
angleTowardsDestination = Cos -1 (base / hypotenuse)
而且,这是你需要的角度。如果需要,请随意将其转换为弧度。
亲切的问候,
Suman Adhikari