Изчисляване на корданати с ъгли

Така че основно имам началните вектори и ангелите, но кодът, с който работя, само актуализира моя ъгъл и се опитвам да стигна до друг вектор.

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)


Добре, вие вашият въпрос в графично представяне

Първо имате скорост, така че трябва да вземете и времева рамка, така че нека приемем, че имаме нужда от координатите след 1s. Формулата за измерване на скоростта е 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 script можете да използвате

// 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