コード例 #1
0
        private void DrawMainObjectPath(ProjectedPositionCalculator ppCalc)
        {
            var position = _objects.MainObject.Location;
            var speed    = _objects.MainObject.Speed;
            var mass     = _objects.MainObject.Mass;

            for (var i = 0; i < 300; i++)
            {
                var forces = new Force(Angle.Zero, 0);
                foreach (var planet in _objects.Terrains)
                {
                    var distance = PointCalculator.Distance(position, planet.Location);
                    var angle    = PointCalculator.CalculateAngle(position, planet.Location);
                    forces += GravityCalculator.CalculateGravity(mass, planet.Mass, distance, angle);
                }

                var acceleration = forces.GetAcceleration(mass);
                speed += acceleration.GetSpeed(new TimeSpan(0, 0, 0, 10));

                if (speed.Value > 50000)
                {
                    break;
                }

                var flownDistance = speed.GetDistance(new TimeSpan(0, 0, 0, 10)).CalculateXAndY();
                position.X += (float)flownDistance.X;
                position.Y += (float)flownDistance.Y;
                var projectedPosition = ppCalc.ProjectPoint(position);
                _graphicsBuffer.Graphics.FillRectangle(new SolidBrush(Color.White), projectedPosition.X,
                                                       projectedPosition.Y, 1, 1);
            }
        }
コード例 #2
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();
            }
        }
コード例 #3
0
        private void LateUpdate()
        {
            // if player is pressing spacebar, activate jetpack
            if (Input.GetKey(KeyCode.Space))
            {
                GetComponent <Rigidbody>().AddForce((transform.up.normalized) * jetpackPower, ForceMode.Acceleration);
            }

            // if player is not on a planet, calculate gravity from planets
            if (currentPlanet == null)
            {
                // todo: cache planets instead of calling very bad FindObjectsOfType every frame
                BaseGravitationalObject[] gravityObjects = FindObjectsOfType <BaseGravitationalObject>();

                foreach (BaseGravitationalObject item in gravityObjects)
                {
                    if (item == this)
                    {
                        continue;
                    }

                    Vector3 direction = item.transform.position - transform.position;
                    float   speed     = GravityCalculator.ConvertNewtonsToVelocity(Mass, GravityCalculator.CalculateGravitationalForceBetweenObjects(Mass, item.Mass, Vector3.Distance(transform.position, item.transform.position)));

                    GetComponent <Rigidbody>().AddForce(direction.normalized * (speed / GravityCalculator.PlanetScale), ForceMode.Acceleration);
                }
            }
        }
コード例 #4
0
        public void CalculateFallingObject_Argument10_returnsThisString()
        {
            //arrange
            const string expected = "The object's position after 10 seconds is -490.5 m.";
            //act
            var actual = GravityCalculator.CalculateFallingObject(10);

            //assert
            Assert.Equal(expected, actual);
        }
コード例 #5
0
        public void CalculateFahrenheit(decimal specificGravity, decimal fahrenheitTemperature, decimal expected, decimal fahrenheitCalibrationTemperature = 68.0m)
        {
            // Arrange
            var gravityCalculator = new GravityCalculator();

            // Act
            var result = gravityCalculator.CalculateFahrenheit(specificGravity, fahrenheitTemperature, fahrenheitCalibrationTemperature);

            // Assert
            result.Should().BeApproximately(expected, 0.00099m);
        }
コード例 #6
0
        public void Calculate(decimal specificGravity, decimal temperature, decimal expected, decimal calibrationTemperature = 20.0m)
        {
            // Arrange
            var gravityCalculator = new GravityCalculator();

            // Act
            var result = gravityCalculator.Calculate(specificGravity, temperature, calibrationTemperature);

            // Assert
            result.Should().BeApproximately(expected, 0.00099m);
        }
コード例 #7
0
 public Functional(ProblemInfo info)
 {
     receivers  = info.Receivers;
     n          = info.Receivers.Length;
     K          = info.P.Length;
     xCellCount = info.X.Length - 1;
     zCellCount = info.Z.Length - 1;
     alpha      = info.Alpha;
     gamma      = info.Gamma;
     g          = new double[n];
     realG      = info.realG;
     calc       = new GravityCalculator(info.X, info.Z, null);
 }
コード例 #8
0
 void FixedUpdate()
 {
     // Update gravity
     Physics.gravity = GravityCalculator.GetGravity(transform.position);
     getTouchInputs();
     // Only allow acceleration and braking if the car is grounded
     if (levitate())
     {
         // Do the keyboard input for movement
         if (Input.GetKey("w") || leftDown)
         {
             // Add a force if we're going forwards or backwards
             rb.AddRelativeForce(new Vector3(0, 0, Acceleration));
         }
         if (Input.GetKey("s") || rightDown)
         {
             rb.AddRelativeForce(new Vector3(0, 0, -Acceleration));
         }
         if (Input.GetKey(KeyCode.LeftShift) || (leftDown && rightDown))
         {
             // Brakes
             limitVel(rb.velocity.magnitude - BrakeSpeed);
         }
     }
     if (Input.GetKey("d"))
     {
         // Add some torque to rotate
         rb.AddRelativeTorque(new Vector3(0, 1, 0) * TurnRate);
     }
     if (Input.GetKey("a"))
     {
         rb.AddRelativeTorque(new Vector3(0, -1, 0) * TurnRate);
     }
     // Do steering based off of phone rotation
     rb.AddRelativeTorque(new Vector3(0, -1, 0) * TurnRate * GyroscopeInput.angle / 45);
     limitVel(MaxSpeed);
     changeSound();
 }