Ejemplo n.º 1
0
        /// <summary>
        /// Processes gravitons for one particle
        /// </summary>
        /// <param name="system"></param>
        /// <param name="part"></param>
        public static void ProcessGravitons(TableDepositor system, Particle part)
        {
            temp.X = 0;
            temp.Y = 0;

            foreach (Graviton ig in system.gravitons)
            {
                GravitonSettings settings = (ig.Settings_Allowed) ? ig.Settings : system.table.Settings.gravitonSettings;

                double length = (part.Position.X - ig.Position.X) * (part.Position.X - ig.Position.X) +
                                (part.Position.Y - ig.Position.Y) * (part.Position.Y - ig.Position.Y);

                //=================================================
                // GRAVITY:
                // g = CONST*M/(radius/11 + 14),
                //=================================================

                // fix treshold
                double acc         = (PhysicSettings.Instance().DEFAULT_GRAVITY_CONSTANT *ig.Settings.weigh) / (length / 114 + 14) * (((A_Rock)ig).Intensity / 100);
                double sqrt_length = Math.Sqrt(length);
                if (sqrt_length < 20)
                {
                    acc *= -Math.Log(sqrt_length - Math.Min(20, sqrt_length - 2));
                }

                // pulsar
                if (settings.Energy_pulsing)
                {
                    acc /= (1 + Math.Tan(settings.Energy_pulse_speed) / 10);
                }

                // calculate velocity
                if (PhysicsSettings.gravitationMode == GravitationMode.ADITIVE)
                {
                    temp.Add(acc * ((ig.Position.X - part.Position.X) / Math.Sqrt(length)),
                             acc * ((ig.Position.Y - part.Position.Y) / Math.Sqrt(length)));
                }
                else if (PhysicsSettings.gravitationMode == GravitationMode.AVERAGE)
                {
                    temp.Add(1 / (acc * ((ig.Position.X - part.Position.X) / Math.Sqrt(length))),
                             1 / (acc * ((ig.Position.Y - part.Position.Y) / Math.Sqrt(length))));
                }
                else if (PhysicsSettings.gravitationMode == GravitationMode.MULTIPLY)
                {
                    temp.Add(acc * ((ig.Position.X - part.Position.X) / Math.Log(length)),
                             acc * ((ig.Position.Y - part.Position.Y) / Math.Log(length)));
                }
            }

            if (PhysicsSettings.gravitationMode == GravitationMode.AVERAGE)
            {
                temp.Invert();
            }

            part.Vector_Acceleration.Add(temp);
        }