获得两条坐标路径之间的角度

时间:2013-02-03 13:57:47

标签: iphone objective-c geometry

我已经坚持了这个问题很长一段时间了。

我正在iOS中构建一个自定义导航应用程序,我有一个CLLocations数组,所以在数组0中我获得了最后两个坐标,得到了那些,然后在数组1中我得到了第一个两个坐标。

然后,我想计算转弯相对于路径的角度(在这种情况下为路径0),它们当前处于打开状态,因此我可以确定用户转向的方式。

我在这里尝试了很多方法但没有成功。有任何提示或建议

Diagram of what I'm trying to do.

非常感谢任何帮助,谢谢!

更新:在阅读完评论后,我又回过头来看了一眼,因为我确信我做对了,结果证明我的积分存在错误,我使用的方法是正确的!

对我来说最有效的方法是获取两条路径的方位,从前一条路径开始,并遵循此指南。

if(self.turnAngle <= 165){
    self.turnString = LEFT;
}else if( self.turnAngle >= 165 && self.turnAngle <= 205 ){
    self.turnString = STRAIGHT;
}else if( self.turnAngle >= 205 ){
    self.turnString = RIGHT;
}

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你在路径1上有2个点(称为p1_x1,p1_y1和p1_x2,p1_y2),路径2上有2个点(称为p2_x1,p2_y1和p2_x2,p2_y2),你想要的找到路径之间的角度?

这不难做到。使用atan2函数查找路径1和路径2的绝对角度,然后从另一个角度减去一个角度。

换句话说,你的代码会有类似的结果:

float anglePath1Radians = atan2(p1_y2 - p1_y1 / p1_x2 - p1_x1);
float anglePath2Radians = atan2(p2_y2 - p2_y1 / p2_x2 - p2_x1);

float angleDifferenceRadians = anglePath1Radians - anglePath2Radians;

请记住,此结果可能是弧度,因此您需要转换为度数。

替代方法

您可以使用点(AKA标量)产品通过取反余弦来找到角度:

float path1Dx = p1_x2 - p1_x1;
float path1Dy = p1_y2 - p1_y1;

float path2Dx = p2_x2 - p2_x1;
float path2Dy = p2_y2 - p2_y1;

float path1Magnitude = sqrt(path1Dx * path1Dx + path1Dy * path1Dy);
float path2Magnitude = sqrt(path2Dx * path2Dx + path2Dy * path2Dy);

float dotProduct = path1Dx * path2Dx + path1Dy * path2Dy;

float angleDifferenceRadians = acos(dotProduct / (path1Magnitude * path2Magnitude));

答案 1 :(得分:0)

更新:阅读完评论后,我回去再看一遍,因为我确信我做对了,结果证明我的观点存有错误,我使用的方法是正确的!

对我来说最有效的方法是获取两条路径的方位,从前一条路径开始,并遵循此指南。

 float previousPathBearing = //get bearing
 float currentPathBearing = //get bearing
 float angle = previousPathBearing - currentPathBearing;
 angle = angle<0?-angle:angle;


if(angle<= 165){
    //LEFT;
}else if( angle>= 165 && angle <= 205 ){
    //STRAIGHT;
}else if( angle >= 205 ){
    //RIGHT;
}

你不得不原谅错别字/愚蠢的错误,因为我很累,但这对我来说很好!