【问题标题】:Efficiently calculate angle (and direction) between 3 points有效计算 3 点之间的角度(和方向)
【发布时间】:2013-11-06 17:40:17
【问题描述】:

使用这个线程 (Calculate the shortest way to rotate, right or left?) 我创建了一个返回正或负旋转角度的函数。问题是,它似乎真的效率低下。任何人都可以帮忙吗? (为了清楚起见,我拼出了 var 名称并创建了辅助函数。)

function getRotation(center, target, heading) {

var north = new point(center.x(), center.y() + 10);

/*  I tried to calculate these seperately so I dont have to calc the distance so many tiems but couldnt come up with anything...
var distCenterToHeading = getDist(center, heading);
var distCenterToTarget = getDist(center, target);
var distTargetToHeading = getDist(target, heading);

var distCenterToNorth = 10;
var distNorthToHeading = getDist(north, heading);
var distNorthToTarget = getDist(north, target);
*/

var angHeadingToTarget = getAngle(center, heading, target);
var angNorthToHeading = getAngle(center, north, heading);
var angNorthToTarget = getAngle(center, north, target);



if (((angNorthToHeading - angNorthToTarget) + 360) % 360 > 180) {
    return angHeadingToTarget;
} else {
    return -angHeadingToTarget;
}
}

function getAngle(Center, heading, target) {
var p12 = getDist(Center, heading);
var p13 = getDist(Center, target);
var p23 = getDist(heading, target);

return Math.acos((sq(p12) + sq(p13) - sq(p23)) / (2 * p12 * p13)) * 180 / Math.PI;
}

function point(iX, iY) {
var _X=iX;
var _Y=iY;
this.x = function () { return _X; };
this.y = function () { return _Y; };

this.setX = function (iX) {
    _X = iX;
}
this.setY = function (iY) {
    _Y = iY;
}
}

function getDist(p1, p2) { return Math.sqrt(Math.pow(p1.x() - p2.x(), 2) + Math.pow(p1.y() - p2.y(), 2)); }

function sq(num) { return Math.pow(num, 2); }

我可能需要多次旋转,而且我听说 sqrt 函数很昂贵...在上面的示例中,它被命中了 9 次,我可以看到其中至少有 3 个是冗余(中心到航向、中心到目标和中心到北)。

有没有更好的方法来完成这一切? 提前致谢, 戴夫

编辑:@Mike Dunlavey 我一直在搞乱 atan2 但我似乎无法得到任何有效的东西。也许我只是缺少一些简单的东西,但你能解释一下吗?谢谢。

【问题讨论】:

    标签: javascript optimization language-agnostic


    【解决方案1】:

    1) 在您的 getDist 函数中,将增量平方而不是调用 Math.pow 可能会更快。 Math.pow 可能将整数幂视为一种特殊情况,但通常它必须包含在 logexp 中,而您不需要。

    2) 要获得从一个点到另一个点的方向,您可以使用Math.atan2 函数。 无需处理距离。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      相关资源
      最近更新 更多