public void Tick(object s, EventArgs e) { foreach (var movingObject in _objects.Rockets) { movingObject.DragForces = new List <Force>(); movingObject.GravityForces = new List <Force>(); foreach (var gravityObject in _objects.Terrains) { var distance = PointCalculator.Distance(movingObject.Location, gravityObject.Location); var angle = PointCalculator.CalculateAngle(movingObject.Location, gravityObject.Location); var force = GravityCalculator.CalculateGravity(movingObject.Mass, gravityObject.Mass, distance, angle); movingObject.GravityForces.Add(force); var altitude = distance - gravityObject.Diameter; if (altitude < 100000) { // Drag Relevant var rocketForceAngle = movingObject._angle; var dragAngle = Angle.FromDegrees(movingObject.Speed.Angle.Degree + 180); var speedDirectionDiff = Angle.FromDegrees(rocketForceAngle.Degree - movingObject.Speed.Angle.Degree); var cd = movingObject.Drag.GetDragCoefficient(speedDirectionDiff); var a = movingObject.Drag.GetArea(speedDirectionDiff); var p = AtmosphereCalculator.CalculateAirDensityAtAltitude(altitude); var dragForce = DragCalculator.CalculateDrag(dragAngle, cd, p, movingObject.Speed, a); movingObject.DragForces.Add(dragForce); } } movingObject.Tick(); } }
public void DragIsCalculatedCorrectly() { var zeroAngle = Angle.FromDegrees(0); var p = AtmosphereCalculator.CalculateAirDensityAtAltitude(5000); var s = new Speed(zeroAngle, 500); var f = DragCalculator.CalculateDrag(zeroAngle, 0.25, p, s, 21); Assert.AreEqual(476787.3, f.Value, 0.1); }
public Velocity CalculateVelocity(Velocity previousVelocity) { var x_netForce = DragCalculator.CalculateDragAtVelocity(previousVelocity.Vx, initialValues); var y_netForce = (initialValues.Gravity) + DragCalculator.CalculateDragAtVelocity(previousVelocity.Vy, initialValues); var velocity = new Velocity { Vx = previousVelocity.Vx - DeltaVelocityCalculator.CalculateDeltaVelocity(deltaTime, x_netForce), Vy = previousVelocity.Vy - DeltaVelocityCalculator.CalculateDeltaVelocity(deltaTime, y_netForce), }; return(velocity); }