为了提高我找到角度的正弦/余弦的速度,我建立了一个参考表,而不是动态计算它们.我有同样的想法,从一个点到另一个点找到角度.
我创建了一个包含3600个标准化向量的表(3600/10 =精度为十分之一度).每当我需要知道从一个点到下一个点的角度时,我会通过表格查找最佳匹配.但是,我担心这可能比使用math.atan2()慢.
这是我正在使用的代码:
创建向量表:
// vector to angle table
var vectorToAngleTable = new Array();
for (i = 0; i < 3600; i += 1) {
    vectorToAngleTable[i] = new Vector2();
    vectorToAngleTable[i] = RotatePoint(forwardVector, i / 10);
}
Run Code Online (Sandbox Code Playgroud)
从两点找出角度:
function NormalizeVector(vector) {
    var toReturn = vector;
    var dist = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
    toReturn.x /= dist.x;
    toReturn.y /= dist.y;
    return toReturn;
}
function PointDirection(position, target) {
    var vector = target;
    var toReturn = 0;
    var smallest = 1.0; …Run Code Online (Sandbox Code Playgroud) 我试图找出两个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
编辑:谢谢所有回答并帮助我弄清楚错误的人!对不起,标题和问题令人困惑.
代码优化在这里说,分析是优化javascript的第一步,建议的引擎是Chrome和Firefox的分析器.这些问题是他们以某种奇怪的方式告诉每个函数执行的时间,但我对它们没有很好的理解.最有用的方法是分析器会告诉每行执行的次数,以及每行可能花费的时间.这样就可以严格地看到瓶颈.但在实施/找到此类工具之前,我们有两种选择:
1)制作自己的计算器,计算某个代码块或行执行的时间和次数2)学会理解哪些是慢速方法,哪些不是
对于选项2,jsperf.com非常有帮助.我试图学习优化数组并在JSPERF.COM中进行速度测试.下图显示了5个主要浏览器的结果,发现了一些我之前不知道的瓶颈.

主要调查结果如下:
1)尽管使用哪种方法进行分配,但为数组分配值要比分配给正常变量要慢得多.
2)在性能关键循环之前预初始化和/或预填充阵列可以显着提高速度
3)与将数值推入数组相比,数学三角函数不是那么慢(!)
以下是每项测试的解释:
1. non_array(100%):
变量以这种方式给出了预定义的值:
var non_array_0=0;
var non_array_1=0;
var non_array_2=0;
...
Run Code Online (Sandbox Code Playgroud)
在定时区域,他们被称为这样:
non_array_0=0;
non_array_1=1;
non_array_2=2;
non_array_3=3;
non_array_4=4;
non_array_5=5;
non_array_6=6;
non_array_7=7;
non_array_8=8;
non_array_9=9;
Run Code Online (Sandbox Code Playgroud)
上面是一个类似数组的变量,但似乎无法以其他方式迭代或引用这些变量作为对阵列的反对.还是有吗?
此测试中的任何内容都不比为变量赋值更快.
2. non_array_non_pre(83.78%)
与测试1完全相同,但变量未预先初始化或预先填充.速度是测试速度的83.78%.在每个测试的浏览器中,预填充变量的速度比未预先填充的速度快.因此,在任何速度关键循环之外初始化(并可能预填充)变量.
测试代码在这里:
var non_array_non_pre_0=0;
var non_array_non_pre_1=0;
var non_array_non_pre_2=0;
var non_array_non_pre_3=0;
var non_array_non_pre_4=0;
var non_array_non_pre_5=0;
var non_array_non_pre_6=0;
var non_array_non_pre_7=0;
var non_array_non_pre_8=0;
var non_array_non_pre_9=0;
Run Code Online (Sandbox Code Playgroud)
3. pre_filled_array(19.96%):
阵列是邪恶的!当我们丢弃正常变量(test1和test2)并将数组放入图片时,速度会显着降低.虽然我们进行了所有优化(预初始化和预填充数组),然后直接分配值而不进行循环或推送,但速度降低到19.96%.这非常难过,我真的不明白为什么会这样.这是我在这次测试中受到的主要冲击之一.数组是如此重要,我没有找到一种方法来制作没有数组的很多东西.
测试数据在这里:
pre_filled_array[0]=0;
pre_filled_array[1]=1;
pre_filled_array[2]=2;
pre_filled_array[3]=3;
pre_filled_array[4]=4;
pre_filled_array[5]=5;
pre_filled_array[6]=6;
pre_filled_array[7]=7;
pre_filled_array[8]=8;
pre_filled_array[9]=9;
Run Code Online (Sandbox Code Playgroud)
4. non_pre_filled_array(8.34%):
这与3的测试相同,但是数组成员不是预先初始化的,也不是预先填充的,只有优化是事先初始化数组: …