使用这个线程(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次,我可以看到其中至少有三个是冗余(中心到航向,中心到目标,中心到北)。
有没有更好的方法一起做这个? 提前致谢, 戴夫
编辑:@Mike Dunlavey 我一直在乱搞atan2,但我似乎无法得到任何有效的东西。也许我只是错过了一些简单的东西,但你能解释一下吗?感谢。答案 0 :(得分:1)
1)在你的getDist
函数中,对方差进行平方可能更快,而不是调用Math.pow
。
有可能Math.pow
将整数幂视为一种特殊情况,但一般情况下它必须包含在log
和exp
中,这是您不需要的。
2)要获得从一个点到另一个点的方向,您可以使用Math.atan2
函数。
无需处理距离。