找到两点之间角度的最快方法

2024-02-08

为了提高查找角度正弦/余弦的速度,我构建了一个参考表,而不是即时计算它们。我对从一点到另一点求角度也有同样的想法。

我创建了一个包含 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)));
}

正如您所看到的,我关心的是它正在经历的所有代码行,以及它查看的表中有多少条目。我很想知道找到角度的最快方法,无论是什么方法。


As angle(v1, v2) = acos( (v1x * v2x + v1y * v2y) / (sqrt(v1x^2+v1y^2) * sqrt(v2x^2+v2y^2)) ) https://stackoverflow.com/a/3441867/1615483我们知道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;

where 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;

where v1是向量[point1.x , point1.y] and v2 is [point2.x , point2.y]


Edit 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 );
}

jsperf http://jsperf.com/shhacos-vs-array预先计算并在数组中查找3601物品与使用acos https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/acos直接地

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到两点之间角度的最快方法 的相关文章