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

C++ 使用x轴计算角度的最快方法,c++,angle,C++,Angle,计算直线和x轴之间角度的最快方法是什么 我需要定义一个函数,它在PI:2PI区间是内射的(我必须确定最上面的点和下面任何点之间的角度) 初试 //#1 double magnitudeTarVec = sqrt(targetVectorX*targetVectorX + targetVectorY*targetVectorY); angle = tarX / magTar; 第二次尝试 //#2 slower angle = atan2(targetVectorY, targetVectorX

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

我需要定义一个函数,它在PI:2PI区间是内射的(我必须确定最上面的点和下面任何点之间的角度)

初试

//#1
double magnitudeTarVec = sqrt(targetVectorX*targetVectorX + targetVectorY*targetVectorY);
angle = tarX / magTar;
第二次尝试

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

我不需要直接的角度(弧度或度数),只是任何值都可以,只要从两个点比较这些值,我就可以知道哪个角度更大。(例如,示例一中的角度介于-1和1之间(它是余弦参数))

检查y是否为零,就像atan2一样;那么商x/y就足够了。(假设我理解正确)

>我刚才写了一个关于函数单调的一般问题,没有任何代码或连接到C++或类似的东西。根据我现在的建议

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

与之相比,最大的好处是,您不必担心无穷大的值,因为所有非零向量(即
targetVectorX
targetVectorY
并非同时都等于零)将导致有限的伪角度值。产生的伪角度将在范围内[−2…2]用于实际角度[−π…π],所以符号和不连续性就像你从
atan2

Hmm中得到的一样,不能删除我手机上的评论。@Mooing so on phone?你从哪里得到这样的免费数据计划?这怎么可能是我需要的?想象一下,我的最高点是原点。其他点如a=[-10,-10]b=[-3,-5]和c=[-8,-5]。按角度排序:c,a,b按你的方法排序:b,c,a…哦,你删除了你的评论,对不起,我的手机有无限的数据,所以手机上的网站很棒,除了我不能删除评论,还有其他一些小事情。-x/(y+.0001)可能更快,那么你不必检查零它是双倍的,把另外7-11个零放在那里=)我刚刚意识到在有+inf和-inf的机器上可能根本不需要做任何特殊的事情。它们应该正确排序,对吗?也许吧?无论拱度如何,被零除总是很混乱的。在这种情况下,加在y上的量应该是y的一小部分,可能使得检查零的速度更快。
double angle = copysign( // magnitude of first argument with sign of second
  1. - targetVectorX/(fabs(targetVectorX) + fabs(targetVectorY)),
  targetVectorY);