用x轴计算角度的最快方法

时间:2011-10-23 18:16:57

标签: c++ angle

计算直线和x轴之间角度的最快方法是什么?

我需要定义一个函数,它在PI:2PI间隔是Injective(我必须在最高点和下面的任何点之间的角度)。

PointType * top = UPPERMOST_POINT;
PointType * targ = TARGET_POINT;

double targetVectorX = targ->x - top->x;
double targetVectorY = targ->y - top->y;

首先尝试

//#1
double magnitudeTarVec = sqrt(targetVectorX*targetVectorX + targetVectorY*targetVectorY);
angle = tarX / magTar;

第二次尝试

//#2 slower
angle = atan2(targetVectorY, targetVectorX);

我不需要直接角度(弧度或度数),只要通过比较这两种值我可以判断哪个角度更大,任何值都可以。 (例如,示例1中的角度介于-1和1之间(它是余弦参数))

2 个答案:

答案 0 :(得分:2)

检查y是否为atan2;然后商x / y会很好。 (假设我理解正确)。

答案 1 :(得分:2)

我刚刚写了Fastest way to sort vectors by angle without actually computing that angle关于在角度中找到单调函数的一般问题,没有任何代码或与C ++或类似的连接。基于the currently accepted answer there我现在建议

double angle = copysign( // magnitude of first argument with sign of second
  1. - targetVectorX/(fabs(targetVectorX) + fabs(targetVectorY)),
  targetVectorY);

the currently accepted answer here相比的最大好处是,您不必担心无限值,因为所有非零向量(即targetVectorXtargetVectorY都不是同时等于零)将导致有限的伪角值。对于实际角度[-π...π],得到的伪角将在[-2 ... 2]的范围内,因此符号和不连续性就像你从atan2获得它们一样。