2016-04-30 125 views
0

所以基本上我有起始矢量和天使,但我正在使用的代码只更新我的角度,我试图去另一个向量。角度计算cordanates

var start_x = 0; 
var start_y = 0; 
var speed = 200; 
var current_x; //This needs to be calculated 
var current_y; //This needs to be calculated 
var current_angle = 53; 

我该如何使用速度和起始位置来计算当前X向量和Y向量?我浏览过这个网站和其他人,但我似乎无法找到答案。

+0

这不是一个真正的编程问题,这是一个数学问题。一旦找出合适的公式,JavaScript部分将变得简单。你有没有尝试http://math.stackexchange.com/? – nnnnnn

+0

即使下面的答案给出了解决这个问题的数学方法,但它的实现可能会有所不同。你能更具体地了解你的项目吗?你在制作一个画布动画吗?你到底想在你的代码中计算x和y?你会用它做什么? – akinuri

+0

尽管已经给出了很好的答案,但您可能需要阅读[三角函数](https://www.mathsisfun.com/algebra/trigonometry.html)。如果你理解它的工作原理,它会更有趣。 – miraculixx

回答

3

好了有你your question in graph representation

首先你有速度,所以你需要一个时间框架也因此让我们假设我们需要1秒后的坐标。测量速度的公式是V = S/T 其中V是速度(方向上的速度)S是距离而T是时间。 因此S = VxT 根据你的速度200,在1秒内行进的距离是200M 现在我们有角度也是你给它的53deg。因此我们可以绘制一个想象的三角形来找出(x,y)未知的新坐标。 要知道的x,y式是

y= sin(theta) x Distance 
x = cos(theta) x Distance 

其中θ等于53deg和距离为200 因此(X,Y)=()

更一点的描述,在我们的假想三角形y是相反的,x是相邻的,并且x,y只是距离0,0的距离。有一个在三角公式,其中规定,

Sin(theta) = opposite/Hypotenuse 
hence 53 = unknown/200 
similarly 
Cos(theta) = Adjacent/Hypotenuse 
hence 53 = unknown/200 
So after calculating we get the result (120.36,159.72) 

所以在Java脚本可以使用

// since Math.cos takes input in radians you have to convert it into degrees. 

    var speed = 200; 
    var time = 1; 
    var angle = 53; 
    x = (Math.cos(angle*(Math.PI/100))* (speed*time); 
    y = (Math.sin(angle*(Math.PI/100))* (speed*time); 

我们计算使用弧度不度,所以你可能需要必要的转换成度,但多数民众赞成不难,只需将(x,y)交换为(y,x),这将是度数的结果。

+0

谢谢你。 –

+0

不客气。 –

1

矢量数学是很辛苦,所以我会写一点点类来实现所有的繁重:

function LameVector(x,y) { 
 
    this.startx = this.x = x; 
 
    this.starty = this.y = y; 
 
    this.angle = false; 
 
    this.mag = 0; 
 
    
 
    this.moveXY = function (x, y) { 
 
    this.x += x; 
 
    this.y += y; 
 
    this.angle = Math.atan2(this.y - this.starty, this.x - this.startx) * 180/Math.PI; 
 
    this.mag = Math.sqrt(Math.pow(this.y - this.starty, 2) + Math.pow(this.x - this.startx, 2)); 
 
    } 
 
    
 
    this.move = function (speed, angle) { 
 
    var ang = angle/180 * Math.PI; 
 
    this.moveXY(speed * Math.cos(ang), speed * Math.sin(ang)); 
 
    } 
 
} 
 
var o = document.getElementById("out"); 
 
var vec1 = new LameVector(0, 0); // starting position 0,0 
 
o.innerHTML += "start x " + vec1.x + ", start y " + vec1.y + "<br>"; 
 

 
vec1.move(200, 53); // move 200 units at angle 53 deg 
 
o.innerHTML += "move1 x " + vec1.x + ", move1 y " + vec1.y + "<br>"; 
 

 
vec1.move(200, 27); // move 200 more units at angle 27 deg 
 
o.innerHTML += "move2 x " + vec1.x + ", move2 y " + vec1.y + "<br>"; 
 

 
// can also get the angle and length 
 
o.innerHTML += "final angle " + vec1.angle + ", magnitude " + vec1.mag + "<br>";
<div id="out"></div>

-1

我已经过这个问题出现之前(Calculate the position of an orbiting object)和使用的以下。

您将使用Math.cos()Math.sin()方法,它们以弧度为角度作为参数。所以

var start_x = 0; 
var start_y = 0; 
var speed = 200; 
var current_x; //This needs to be calculated 
var current_y; //This needs to be calculated 
var current_angle = 53; 

// converting degrees to radian 
var angleInRad = current_angle * (Math.PI/180); 

var time = 1; // second 
var distance = speed * time; 

// calculate the x and y values 
current_x = Math.cos(angleInRad) * distance; 
current_y = Math.sin(angleInRad) * distance; 

console.log(current_x, current_y); // 120.36, 159.72 
+0

为什么downvote? o.O – akinuri

+0

我不认为你可以通过速度作为参数,除非你在一秒钟内获得坐标。 –

+0

更具体你需要通过距离不是速度这是速度*时间,因为速度=距离/时间 –