为了提高我找到角度的正弦/余弦的速度,我建立了一个参考表,而不是动态计算它们.我有同样的想法,从一个点到另一个点找到角度.
我创建了一个包含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;
vector.x -= position.x;
vector.y -= position.y;
vector = NormalizeVector(vector);
for (i = 0; i < 3600; i += 1) {
if (PointDistance(vectorToAngleTable[i], vector) < smallest) {
smalllest = PointDistance(vectorToAngleTable[i], vector);
toReturn = i;
}
}
return toReturn;
}
function PointDistance(point1, point2) {
return Math.sqrt(((point2.x - point1.x) * (point2.x - point1.x)) + ((point2.y - point1.y) * (point2.y - point1.y)));
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我关注的是它正在经历的所有代码行,以及它所查看的表上有多少条目.无论方法是什么,我都想知道找到角度的最快方法.
Pau*_* S. 12
正如angle(v1, v2) = acos( (v1x * v2x + v1y * v2y) / (sqrt(v1x^2+v1y^2) * sqrt(v2x^2+v2y^2)) )
我们知道v2 = [1, 0]
var v = {x: 0, y: 1},
angleRad = Math.acos( v.x / Math.sqrt(v.x*v.x + v.y*v.y) ),
angleDeg = angleRad * 180 / Math.PI;
Run Code Online (Sandbox Code Playgroud)
v
矢量在哪里[point2.x - point1.x , point2.y - point1.y]
编辑 - 我刚刚意识到你可能意味着将每个点视为一个向量,在这种情况下它就是
var v1 = {x: 0, y: 1}, v2 = {x: 1, y: 0},
angleRad = Math.acos( (v1.x * v2.x + v1.y * v2.y) / ( Math.sqrt(v1.x*v1.x + v1.y*v1.y) * Math.sqrt(v2.x*v2.x + v2.y*v2.y) ) ),
angleDeg = angleRad * 180 / Math.PI;
Run Code Online (Sandbox Code Playgroud)
v1
矢量在哪里[point1.x , point1.y]
,v2
是[point2.x , point2.y]
编辑2
如果您多次使用矢量长度,请加速,将其保存为例如,v.length = ...
这样您就可以在不重新计算的情况下获得它.如果您知道每个向量都需要多次计算角度,请使用我编写的第一个方法并对其进行缓存,即v.angle = ...
.你可以那么你可以做v2.angle - v1.angle
在二者之间,找到等角度
,即有
function Vector(x, y){
this.x = x;
this.y = y;
this.length = Math.sqrt(x*x + y*y);
this.angle = Math.acos( x / this.length );
}
Run Code Online (Sandbox Code Playgroud)
jsperf预先计算和查找3601
项目数组与直接使用acos
归档时间: |
|
查看次数: |
10991 次 |
最近记录: |