1

このスレッド (右または左に回転する最短の方法を計算しますか? ) を使用して、正または負の回転角度を返す関数を作成しました。問題は、それが本当に効率が悪いように見えることです。誰でも助けることができますか?(わかりやすくするために、変数名を綴り、ヘルパー関数を作成しました。)

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をいじっていましたが、うまくいくものは何も得られないようです。多分私は単純なものを見逃しているだけかもしれませんが、説明してもらえますか? ありがとう。

4

1 に答える 1

1

1)getDist関数では、 を呼び出すよりも、デルタを 2 乗する方が速い場合がありますMath.powMath.pow整数の累乗を特殊なケースとして扱うことは可能ですが、一般的には必要のないlogandでラップする必要があります。exp

2) ある点から別の点への方向を取得するには、Math.atan2関数を使用するだけです。距離に対処する必要はありません。

于 2013-11-06T19:09:46.713 に答える