我已经坚持了这个问题很长一段时间了。
我正在iOS中构建一个自定义导航应用程序,我有一个CLLocations数组,所以在数组0中我获得了最后两个坐标,得到了那些,然后在数组1中我得到了第一个两个坐标。
然后,我想计算转弯相对于路径的角度(在这种情况下为路径0),它们当前处于打开状态,因此我可以确定用户转向的方式。
我在这里尝试了很多方法但没有成功。有任何提示或建议
非常感谢任何帮助,谢谢!
更新:在阅读完评论后,我又回过头来看了一眼,因为我确信我做对了,结果证明我的积分存在错误,我使用的方法是正确的!
对我来说最有效的方法是获取两条路径的方位,从前一条路径开始,并遵循此指南。
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;
}
答案 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;
}
你不得不原谅错别字/愚蠢的错误,因为我很累,但这对我来说很好!