问题的导出与思考
在一个demo的开发中,需要处理一个2D平面上的移动物体到某个具体的点的运动问题,其中有一个阶段需要判断物体当前坐标与目标坐标的夹角,以方向角(角度制0~360)表示。那么很自然的我们就会想到使用atan来计算目标与当前位置之间的夹角,只需要知道两点的xy坐标即可。则用C++表示如下
#include <cmath>
Point current_pos; //当前位置
Point target_pos; //目标位置
target_angle = atan((target_pos.y - current_pos.y) / (target_pos.x - current_pos.x));
当然,别忘了分母不能为0,加一下判断逻辑
//其中一种可能的判断逻辑
if (abs(target_pos.x - current_pos.x) < 0.01)
target_angle = 90.0 * (target_pos.y > current_pos.y ? 1 : -1);
最后,将atan返回得到的弧度制转换为角度值
const double pi 3.141592653
target_angel = target_angle * 180.0 / pi;
随后,我对寻路逻辑的代码进行了审查,发现了许多问题
比如atan的值域之后±90°,转换为正也就是只有平面直角坐标系的I,IV象限能够识别,其他的象限不能够得到角度值,所以还需要根据坐标值判断方向角象限位置
if (target_pos.x - current_pos.x < 0)
target_angle += 180.0;
然而,在实际的使用过程中,我发现移动物体的转角会在某些特定角度,比如0°,45°,90°,135°,180°,277°,314°
完整寻路逻辑代码如下

本文针对2D平面上移动物体到指定点的运动问题,详细探讨了使用atan函数计算方向角存在的问题及解决方案。通过对平面直角坐标系进行分区,实现了在各区域内计算不超过45°的角度值,有效提高了寻路角度的准确性。
最低0.47元/天 解锁文章
4557

被折叠的 条评论
为什么被折叠?



