2016-08-24 9 views
0

Моя ракета попадает в этот объект Инерции, как определено в handleCollision. Я прохожу в ракете, которая имеет значение .r для своей теты и .power за ее величину.Неэластичное столкновение только движущегося объекта вправо

Я хотел обновить свой .rotation & .magnitude согласно неупругого столкновения, как это определено Wikipedia

При столкновении с левой стороны, мой инерция перемещается вправо.

Но при столкновении справа он совершает ошибки и движется ровно на 180 градусов. Поэтому, если ракета поднята и направо под углом 45 градусов от объекта инерции, объект будет двигаться вверх и вправо под углом 45 градусов.

Что мне здесь не хватает? Я думал, что это может быть проблемой для функции atan, поэтому я преобразовал компонент y компонент & x в вектор для радианов первой, той же самой проблемы.

handleCollision(rocket) { 
    var angle = rocket.r * Math.PI/180.0; 
    var rr = this.rotation * Math.PI/180; 

    var rocketVector = {'x' : r.power * Math.cos(angle), 'y' : r.power * Math.sin(angle)}; 
    var inertiaVector = {'x' : this.magnitude * Math.cos(rr), 'y' : this.magnitude * Math.sin(rr)}; 

    var rMass = 10; 
    var shipMass = 10; 

    var x = (rMass * rocketVector.x) + (shipMass * inertiaVector.x); 
    var y = (rMass * rocketVector.y) + (shipMass * inertiaVector.y); 
    var xDividedByMass = x/(rMass + shipMass); 
    var yDividedByMass = y/(rMass + shipMass); 

    var yRadians = (yDividedByMass * Math.PI/180); 
    var xRadians = (xDividedByMass * Math.PI/180); 
    var theta = Math.atan(yRadians/xRadians); 

    theta = theta * 180/Math.PI; 
    console.log(theta); 

    var hypotenuse = Math.sqrt((xDividedByMass * xDividedByMass) + (yDividedByMass * yDividedByMass)); 
    this.magnitude = hypotenuse; 
    this.rotation = theta; 
    if (this.rotation < 0) { 
     this.rotation += 360; 
    } else if (this.rotation > 360) { 
     this.rotation -= 360; 
    } 
} 
+0

Это не проблема с радианами в арктане. Когда вы делаете y/x, pi/180 отменят в любом случае. Кроме того, это компоненты скорости, а не углы. –

+0

Спасибо, я пытаюсь следовать http://www.dummies.com/how-to/content/how-to-find-a-vectors-magnitude-and-direction.html – quantumpotato

+0

О, ваш ответ есть. Вы хотели добавить 180 к вашему вектору, а не 360. Arctan имеет ограниченный диапазон, а тангенс имеет период 180, поэтому вам нужно использовать логику, чтобы определить угол, основанный на диапазоне, в котором вы знаете, что он должен быть. –

ответ

1

Если xDividedbyMass> 0, то велики, потому что вы квадрант I или IV, где арктангенс выгоняет его значения. Если вам не нравится отрицательный угол, хорошо добавьте 360, как вы. Но если x < 0 и y> 0, вы получите отрицательный угол и хотите добавить 180, чтобы добраться до Q II (касательная имеет период 180). И если x < 0 и y < 0, вы в QIII, и снова arctan дает вам что-то в Q1, к которому вы должны добавить 180. Логика будет выглядеть примерно так.

if ((x > 0) && (y<0)) { 
    this.rotation += 360; 
} else if (x<0) { 
    this.rotation += 180; 
}