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); }