计算直线和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之间(它是余弦参数))
答案 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相比的最大好处是,您不必担心无限值,因为所有非零向量(即targetVectorX
和targetVectorY
都不是同时等于零)将导致有限的伪角值。对于实际角度[-π...π],得到的伪角将在[-2 ... 2]的范围内,因此符号和不连续性就像你从atan2
获得它们一样。