Вычисление корданатов с углами

Итак, в основном у меня есть начальные векторы и ангелы, но код, с которым я работаю, только обновляет мой угол, и я пытаюсь перейти к другому вектору.

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, используя скорость и начальные позиции? Я просмотрел этот сайт и другие, но я не могу найти ответ.


person Jacob Owen    schedule 30.04.2016    source источник
comment
На самом деле это не проблема программирования, это проблема математики. Как только вы разберетесь с подходящими формулами, часть JavaScript будет легкой. Вы пробовали math.stackexchange.com?   -  person nnnnnn    schedule 30.04.2016
comment
Несмотря на то, что приведенные ниже ответы дают вам математический подход к решению этой проблемы, его реализация может отличаться. Можно поподробнее о вашем проекте? Вы делаете анимацию холста? Где именно вы хотите вычислить x и y в своем коде? Что ты будешь делать с этим?   -  person akinuri    schedule 30.04.2016
comment
несмотря на уже предоставленные хорошие ответы, вы можете прочитать о тригонометрии. Это веселее, если вы понимаете, почему это работает.   -  person miraculixx    schedule 30.04.2016
comment
Да, я пытаюсь сделать анимацию холста   -  person Jacob Owen    schedule 01.05.2016


Ответы (3)


Итак, вы ваш вопрос в графическом представлении

Во-первых, у вас есть скорость, поэтому вам также нужно взять временные рамки, поэтому предположим, что нам нужны координаты после 1 с. Формула для измерения скорости: V = S/T, где V — скорость (скорость в направлении), S — расстояние, а T — время. Следовательно, S = VxT. Согласно вашей скорости 200, расстояние, пройденное за 1 секунду, равно 200M, теперь у нас также есть угол, который вы указали как 53 градуса. Следовательно, мы можем нарисовать воображаемый треугольник, чтобы найти (x, y) новые координаты, которые неизвестны. Чтобы узнать x, y формула

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

где тета равна 53 градусам, а расстояние равно 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), что будет результатом с градусами.

person Stack learner    schedule 30.04.2016

Векторная математика сложна, поэтому я бы написал небольшой класс, чтобы сделать всю тяжелую работу:

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>

person James    schedule 30.04.2016

Я сталкивался с этой проблемой раньше (Рассчитать положение орбитального объекта) и использовал следующее.

Вы будете использовать методы 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
person akinuri    schedule 30.04.2016
comment
Я не думаю, что вы можете передать скорость в качестве параметра, если вы не получаете координаты за секунду. - person Stack learner; 30.04.2016
comment
чтобы быть более конкретным, вам нужно пройти расстояние, а не скорость, которая равна скорости * времени, поскольку скорость = расстояние/время - person Stack learner; 30.04.2016
comment
ваша ссылка также использует расстояние в качестве параметра, пожалуйста, проверьте - person Stack learner; 30.04.2016
comment
Исправлена. Если он делает анимацию холста и получает положение объекта в каждом кадре, эта переменная time не имеет значения, а его переменная speed равна расстоянию. Ему просто нужно назвать это лучше. - person akinuri; 30.04.2016