示例#1
0
        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);
        }