使用起点,距离和角度查找新坐标


12

好吧,说我有一个点坐标。

var coordinate = { x: 10, y: 20 };

现在我也有距离和角度。

var distance = 20;
var angle = 72;

我要解决的问题是,如果我想从起始坐标沿角度方向移动20个点,如何找到新坐标?

我知道答案涉及正弦/余弦之类的东西,因为我以前知道如何做到这一点,但此后我就忘记了公式。有人可以帮忙吗?


1
从什么角度72度?X轴,Y轴?还有吗 顺时针,逆时针?
pdr

@pdr 90度将是北的方向,45度将是东北等的方向
dqhendricks

Answers:


5

索卡托

正弦=对边/斜边余弦=邻边/斜边正切=对边/斜边

在您的示例中:

Sine(72) = Y/20 -> Y = Sine(72) * 20
Cosine(72) = X/20 -> X = Cosine(72) *20

问题是您必须注意所处的象限。该象限在右上象限中可以正常工作,而在其他三个象限中却不能很好地工作。


1
这适用于所有象限。旋转向量(X,Y)的完整公式为X'= X * sin(角度)+ Y * cos(角度)和Y'= X * sin(角度)+ Y * -cos(角度)。仅从x轴(1,0)旋转时,这可以简化为上面的内容。
耐嚼口香糖

嗯...我还记得什么变换有关象限的陷阱吗?
戴夫·奈

2
请注意,在javascript中,Math.sin之类的输入以弧度为单位,因此您需要转换:radians = (degrees * (Math.PI/180)
Brian

1
@DaveNay在执行Arc函数时遇到问题。Sin(45度)= Sin(135度),因此反正弦(sin(135度))将返回45度;Cos(45)= Cos(315)...
mhoran_psprep 2012年

2

只是为了记录来自Movable Type Scripts的javascript改编

function createCoord(coord, bearing, distance){
    /** http://www.movable-type.co.uk/scripts/latlong.html
     φ is latitude, λ is longitude, 
     θ is the bearing (clockwise from north), 
     δ is the angular distance d/R; 
     d being the distance travelled, R the earth’s radius*
     **/

    var 
        radius = 6371e3, //meters
        δ = Number(distance) / radius, // angular distance in radians
        θ = Number(bearing).toRad();
        φ1 = coord[1].toRad(),
        λ1 = coord[0].toRad();

    var φ2 = Math.asin(Math.sin1)*Math.cos(δ) + Math.cos1)*Math.sin(δ)*Math.cos(θ));

    var λ2 = λ1 + Math.atan2(Math.sin(θ)*Math.sin(δ)*Math.cos1), Math.cos(δ)-Math.sin1)*Math.sin2));

    λ2 = 2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180°

    return 2.toDeg(), φ2.toDeg()]; //[lon, lat]
}

Number.prototype.toDeg = function() { return this * 180 / Math.PI; }
Number.prototype.toRad = function() { return this * Math.PI / 180; }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.