根据给定的角度和长度计算向量

11

在javascript中,我是否有办法调用一个函数,传入x和y坐标以及方向(以角度表示),并返回一组新的坐标,这些坐标已经从原始坐标按给定方向移动了10px? 我找了一圈,但我能找到的都是获取两个给定坐标的角度的方法。


当你说“方向”的时候,你打算如何描述呢?例如:你可以使用相对于x轴的角度(θ)。描述这个方法对你的答案非常重要。无论使用什么编程语言,javascript都是无关紧要的,因为实现方式都是一样的。 - drew_w
3个回答

13

该函数返回一个包含新坐标的数组[xCoord, yCoord]

function myFunction(xCoord, yCoord, angle, length) {
    length = typeof length !== 'undefined' ? length : 10;
    angle = angle * Math.PI / 180; // if you're using degrees instead of radians
    return [length * Math.cos(angle) + xCoord, length * Math.sin(angle) + yCoord]
}

没有必要使用 !== 运算符,!= 就足够了,因为你知道你正在将它与一个字符串进行比较,并且你知道 typeof 返回一个字符串。 - Ryan
2
你是对的,!=已经足够了,但使用严格相等运算符 !===== 是一种推荐最佳实践,因为它不鼓励类型强制转换,后者由不可记忆的规则执行。 - Marcus McLean

1
我希望指出,根据我的看法,答案是不正确的。我创建了一个 JSFiddle,展示正确的实现方式应该像这样:
function getRelativeVector(angle, length, xOffset, yOffset) {
    angle = angle * Math.PI / 180; 
    return { 
        X:length * Math.sin(angle) + xOffset, 
        Y:length * Math.cos(angle) + yOffset 
    };
}

这里展示的来自 @Audrius 和 @Markus 的其他解决方案仅在 cos 和 sin 中扭曲。它们仅适用于 0 到 45 度之间的角度。
公式如下:
- X = length * sin(angle) + xLocation - Y = length * cos(angle) + yLocation

0

在您的情况下,x坐标的偏移量为L*cos(a),y坐标的偏移量为L*sin(a),其中a是角度(“给定方向”),L为10像素。


当我执行10*Math.cos(90)时,它返回-4.480736161291702,如果90度是正确的,那不应该只是10吗? - Bobdinator
请查看我的回复。Math.cos()Math.sin() 的参数是以弧度为单位的角度,因此您需要将角度转换为弧度(请参见我的代码中的注释)。 - Marcus McLean
哦,我明白了,这里使用弧度而不是角度,可能应该说明一下。 - Bobdinator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接