c++中atan精度不够的情况如何处理

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

问题的导出与思考

在一个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°
完整寻路逻辑代码如下


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值