【发布时间】:2012-10-15 20:32:27
【问题描述】:
为了提高找到角度的正弦/余弦的速度,我建立了一个参考表,而不是即时计算它们。我也有同样的想法来找到从一个点到另一个点的角度。
我创建了一个包含 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);
}
从两点求角度:
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)));
}
如您所见,我关心的是它要遍历的所有代码行,以及它要遍历的表中有多少条目。我很想知道找到角度的最快方法,不管是什么方法。
【问题讨论】:
-
使用内置函数几乎肯定更快(这是javascript)。特别是因为您现在的方法涉及取平方根,这在效率方面可能与使用反正切函数完全相同,因为 sqrt 可能是用大约 5 次牛顿近似迭代完成的,而 arctan 可能是用无穷级数的前几项。
-
toReturn.x /= dist.x; toReturn.y /= dist.y;看起来不对。dist是一个标量,而不是另一个向量。
标签: javascript math