使用余弦规则找到两个向量之间的角度并不难.但是,因为我正在为资源非常有限的平台编程,所以我想避免计算诸如sqrt
和arccos
.即使是简单的划分也应该尽可能地受到限制.
幸运的是,我不需要角度本身,但只需要一些与所述角度成比例的值.
所以我正在寻找一些计算上便宜的算法来计算与两个矢量之间的角度相关的量.到目前为止,我还没有找到符合条件的东西,也没有能够自己想出一些东西.
我有自己的,非常快的cos函数:
float sine(float x)
{
const float B = 4/pi;
const float C = -4/(pi*pi);
float y = B * x + C * x * abs(x);
// const float Q = 0.775;
const float P = 0.225;
y = P * (y * abs(y) - y) + y; // Q * y + P * y * abs(y)
return y;
}
float cosine(float x)
{
return sine(x + (pi / 2));
}
Run Code Online (Sandbox Code Playgroud)
但是现在当我描述时,我发现acos()正在杀死处理器.我不需要高度精确.什么是计算acos的快速方法(x)谢谢.
我试图找出两个2D矢量之间的角度(以度为单位).我知道我需要使用trig,但我对它不太好.这就是我想要解决的问题(Y轴向下增加): 替代文字http://i38.tinypic.com/2dcefch.png
我正在尝试使用此代码,但它根本不起作用(由于某种原因计算随机角度):
private float calcAngle(float x, float y, float x1, float y1)
{
float _angle = (float)Math.toDegrees(Math.atan2(Math.abs(x1-x), Math.abs(y1-y)));
Log.d("Angle","Angle: "+_angle+" x: "+x+" y: "+y+" x1: "+x1+" y1: "+y1);
return _angle;
}
Run Code Online (Sandbox Code Playgroud)
这些是我的结果(提供恒定位置时常数,但是当我改变位置时,角度改变,我找不到两个角度之间的任何连接):
位置1:x:100 y:100 x1:50 y1:50角度:45
位置2:x:92 y:85 x1:24 y1:16角度:44.58
位置3:x:44 y:16 x1:106 y1:132角度:28.12
编辑:谢谢所有回答并帮助我弄清楚错误的人!对不起,标题和问题令人困惑.