2016-08-24 2 views
0

Meine Rakete trifft dieses Trägheitsobjekt, wie in handleCollision definiert. Ich gebe eine Rakete mit einem .r Wert für ihr Theta und .power für ihre Größe.Inelastische Kollision nur bewegliches Objekt nach rechts

Ich bin zu wollen meine .rotation & .magnitude nach einem unelastischen Kollision zu aktualisieren, wie durch Wikipedia

definiert Wenn von links kollidiert, meine Trägheit bewegt sich nach rechts.

Aber wenn von rechts kollidiert es Fehler und bewegt sich genau 180 Grad aus. Wenn also die Rakete in einem Winkel von 45 Grad zum Trägheitsobjekt steht, bewegt sich das Objekt in einem Winkel von 45 Grad nach rechts.

Was fehlt mir hier? Ich dachte, es könnte ein Problem mit der Atan-Funktion sein, so konvertierte ich durch die y-Komponente & X-Komponente des Vektors zu Radianten zuerst, das gleiche Problem.

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

Es ist kein Problem mit dem Radiant im Arctan. Wenn Sie y/x machen, heben sich die Pi/180 sowieso auf. Außerdem sind dies Geschwindigkeitskomponenten, keine Winkel. –

+0

Danke, ich versuche zu folgen http://www.dummies.com/how-to/content/how-to-find-a-vectors-magnitude-and-direction.html – quantumpotato

+0

Oh, Ihre Antwort ist da. Sie wollten 180 zu Ihrem Vektor hinzufügen, nicht 360. Arctan hat einen eingeschränkten Bereich, und Tangens hat eine Periode von 180, also müssen Sie Logik verwenden, um den Winkel basierend auf dem Bereich zu bestimmen, in dem Sie wissen, dass er sein muss. –

Antwort

1

Wenn xDividedbyMass> 0, Sie sind groß, weil Sie Quadrant I oder IV, wo arctangent Kicks aus seine Werte sind. Wenn Sie den negativen Winkel nicht mögen, fügen Sie 360 ​​hinzu, wie Sie es taten. Aber wenn x < 0 und y> 0, erhalten Sie einen negativen Winkel und möchten 180 hinzufügen, um zu Q II zu gelangen (Tangens hat eine Periode von 180). Und wenn x < 0, und y < 0 sind, sind Sie in QIII und wieder arctan gibt Ihnen etwas in Q1, dem Sie 180 hinzufügen müssen. Die Logik wird etwa so aussehen.

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