我正在尝试使用c ++通过中心点识别两点之间的角度。我正在使用std :: atan2(y,x)来获得角度。为简洁起见,我将弧度转换为度数。这工作正常。
然而,当两点的位置发生变化时,我的问题在于符号变化。给定的角度是-200或160.当然,这是相同的角度仅360度。我宁愿拥有相同的价值来使比较检查得到理智。我怎样才能做到这一点?
我用来计算角度的函数,并转换为度数:
static double computeAngleFromCenter(cv::Point center, cv::Point p, bool asDegrees = false)
{
double angle = std::atan2(p.y - center.y, p.x - center.x);
if (asDegrees)
angle *= 180 / 3.1415926;
return angle;
}
显而易见的答案是,如果角度<1,则只需添加360。 0,但这是最好的方法吗?
答案 0 :(得分:1)
返回值:
区间为[-pi,+ pi]的y / x的主反正切 弧度。一个弧度相当于180 / PI度。
如果您希望在[0, +2pi]
间隔内返回一个值,那么是的,您需要应用一些修正。
答案 1 :(得分:1)
您可以在有条件转换为度数之前使用fmod:
angle = fmod( angle + PI * 2, PI * 2 );
取决于编译器和数学库,它可能比更直接的代码更快或更慢,更容易阅读:
if (angle < 0)
angle += PI * 2;
如果此代码仅在台式机上每秒使用数百次,我怀疑您是否会注意到差异。对于手机/平板电脑,也许我会将这个限制设置为每秒数十次。
编辑:负角度需要添加PI * 2
,而不只是PI
。
答案 2 :(得分:0)
根据atan2
的文档,返回始终在[-pi, pi]
范围内,所以我不认为您会看到-200 deg
正如您所建议的那样。这说确实仍然将第3和第4象限的结果作为负值返回。由于函数显式地调用了这种行为,因此最直接的解决方案是将2pi
弧度添加到负返回结果中。
答案 3 :(得分:0)
更直接的可能:
static double computeAngleFromCenter(cv::Point center, cv::Point p, bool asDegrees = false)
{
double angle = std::atan2(p.y - center.y, p.x - center.x);
if (asDegrees)
angle *= 180 / 3.1415926;
return angle + 360; // [180, 540] Always positive.
}
答案 4 :(得分:0)
static double computeAngleFromCenter(cv::Point center, cv::Point p, bool asDegrees = false)
{
double angle = std::atan2(p.y - center.y, p.x - center.x);
if (asDegrees)
angle *= 180 / 3.1415926;
if(angle<0)angle+=360;
return angle;
}