public static void StartSimulation()
 {
     activesys = new Structures.PlanetarySystem(CustomBodies);
     if (activesys.centers == null)
     {
         activesys.centers = new List <int>();
     }
     activesys.centers.Clear();
     for (int i = 0; i < CustomCenters.Count; i++)
     {
         if (CustomCenters[i])
         {
             activesys.centers.Add(i);
         }
     }
     mainWindow = new Gtk.Window("Astrodynamics Simulation");
     mainWindow.SetDefaultSize(1280, 720);
     mainWindow.Events            |= EventMask.PointerMotionMask | EventMask.ScrollMask;
     mainWindow.DeleteEvent       += delegate { Application.Quit(); };
     mainWindow.KeyPressEvent     += Input.OnKeyPress;
     mainWindow.MotionNotifyEvent += Input.OnMouseMovement;
     mainWindow.ScrollEvent       += Input.OnScrollMovement;
     sys_view = new SystemView(activesys);
     sys_view.radius_multiplier = radius_multiplier;
     sys_view.line_max          = line_max;
     mainWindow.Add(sys_view);
     activesys.StartAsync(step: timestep); // Start Mechanics
     sys_view.PlayAsync(interval: 0);      // Start Display
     mainWindow.ShowAll();
 }
        public static bool PlanetarySystemTest()
        {
            List <Body> bodies = Structures.Examples.solar_system_bodies;
            var         sys    = new PlanetarySystem(bodies);

            if (!bodies.SequenceEqual(((IEnumerable <Body>)sys).ToList()))
            {
                Console.WriteLine("Constructor does not add bodies");
                return(false);
            }
            var b = Structures.Examples.solar_system_bodies[3];

            sys.Add(b);
            if (sys[sys.Count - 1] != b)
            {
                Console.WriteLine("Add() failed");
                return(false);
            }
            var position1 = new Vector3(2, -4, 12);

            sys = new PlanetarySystem(new List <Body>()
            {
                new Body()
                {
                    stdGrav = 10
                },
                new Body()
                {
                    stdGrav  = 20,
                    position = position1
                }
            });
            if (sys.Barycenter() != 2 * position1 / 3)
            {
                Console.WriteLine("Barycenter 1 incorrect");
                return(false);
            }
            sys[1].stdGrav /= 2;
            var position1polar = Vector3.CartesianToPolar(position1);
            var position2polar = new Vector3(position1polar.x, position1polar.y + Math.PI / 3, position1polar.z);

            sys.Add(new Body {
                stdGrav  = 10,
                position = Vector3.PolarToCartesian(position2polar)
            });
            double  distance = Math.Sqrt(3) / 3;
            Vector3 expected_barycenter_polar = new Vector3(distance * position1polar.x, position1polar.y + Math.PI / 6, position1polar.z);

            if (sys.Barycenter() != Vector3.PolarToCartesian(expected_barycenter_polar))
            {
                Console.WriteLine("Barycenter 2 incorrect");
                return(false);
            }
            return(true);
        }
 static Examples()
 {
     sun = new Body()
     {
         name     = "Sol",
         stdGrav  = 1.32712440018e20,
         radius   = 696342e3 / 5,             // 5x smaller than normal for viewabilty
         position = Vector3.zero,
         velocity = Vector3.zero,
         color    = new Vector3(1, 1, 0)
     };
     solar_system_elements = new List <OrbitalElements>()
     {
         // Taken from data at the J2000 Epoch
         // http://www.met.rdg.ac.uk/~ross/Astronomy/Planets.html
         new OrbitalElements()
         {
             // Mercury
             semilatusrectum        = 0.37073084632655 * AU,
             eccentricity           = 0.20563069,
             inclination            = 7.00487 * deg,
             ascendingNodeLongitude = 48.33167 * deg,
             periapsisArgument      = 77.45645 * deg,
             trueAnomaly            = 252.25084 * deg
         },
         new OrbitalElements()
         {
             // Venus
             semilatusrectum        = 0.723298805955343 * AU,
             eccentricity           = 0.00677323,
             inclination            = 3.39471 * deg,
             ascendingNodeLongitude = 76.68069 * deg,
             periapsisArgument      = 131.53298 * deg,
             trueAnomaly            = 181.97973 * deg
         },
         new OrbitalElements()
         {
             // Earth
             semilatusrectum        = 0.999720878516836 * AU,
             eccentricity           = 0.01671022,
             inclination            = 0.00005 * deg,
             ascendingNodeLongitude = 348.73936 * deg,
             periapsisArgument      = 102.94719 * deg,
             trueAnomaly            = 100.46435 * deg
         },
         new OrbitalElements()
         {
             // Mars
             semilatusrectum        = 1.51036704082126 * AU,
             eccentricity           = 0.09341233,
             inclination            = 1.85061 * deg,
             ascendingNodeLongitude = 49.57854 * deg,
             periapsisArgument      = 336.04084 * deg,
             trueAnomaly            = 355.45332 * deg
         },
         new OrbitalElements()
         {
             // Jupiter
             semilatusrectum        = 5.191177516718821 * AU,
             eccentricity           = 0.04839266,
             inclination            = 1.30530 * deg,
             ascendingNodeLongitude = 100.55615 * deg,
             periapsisArgument      = 14.75385 * deg,
             trueAnomaly            = 34.40438 * deg
         },
         new OrbitalElements()
         {
             // Saturn
             semilatusrectum        = 9.50910488810135 * AU,
             eccentricity           = 0.05415060,
             inclination            = 2.48446 * deg,
             ascendingNodeLongitude = 113.71504 * deg,
             periapsisArgument      = 92.43194 * deg,
             trueAnomaly            = 49.94432 * deg
         },
         new OrbitalElements()
         {
             // Uranus
             semilatusrectum        = 19.1485673429066 * AU,
             eccentricity           = 0.04716771,
             inclination            = 0.76986 * deg,
             ascendingNodeLongitude = 74.22988 * deg,
             periapsisArgument      = 170.96424 * deg,
             trueAnomaly            = 313.23218 * deg
         },
         new OrbitalElements()
         {
             // Neptune
             semilatusrectum        = 30.0667468812982 * AU,
             eccentricity           = 0.00858587,
             inclination            = 1.76917 * deg,
             ascendingNodeLongitude = 131.72169 * deg,
             periapsisArgument      = 44.97135 * deg,
             trueAnomaly            = 304.88003 * deg
         },
         new OrbitalElements()
         {
             // Pluto
             semilatusrectum        = 39.48168677 * AU,
             eccentricity           = 0.24880766,
             inclination            = 17.14175 * deg,
             ascendingNodeLongitude = 110.30347 * deg,
             periapsisArgument      = 224.06676 * deg,
             trueAnomaly            = 238.92881 * deg
         }
     };
     solar_system_bodies = new List <Body>()
     {
         (Body)sun.Clone(),
         new Body()
         {
             name    = "Mercury",
             stdGrav = 2.2033e13,
             radius  = 2439.7e3,
             color   = new Vector3(0.5604629613577541, 0.5506810776290613, 0.5615709550944886)
         },
         new Body()
         {
             name    = "Venus",
             stdGrav = 3.24860e14,
             radius  = 6051.8e3,
             color   = new Vector3(0.7290057613658241, 0.7163768245238121, 0.6791579213171579)
         },
         new Body()
         {
             name    = "Earth",
             stdGrav = 3.986004419e14,
             radius  = 6371.0e3,
             color   = new Vector3(0.36141510867913057, 0.3805593555251558, 0.4684865790976585)
         },
         new Body()
         {
             name    = "Mars",
             stdGrav = 4.282837e13,
             radius  = 3389.5e3,
             color   = new Vector3(0.5128845217545257, 0.3367414685964679, 0.2022838932412694)
         },
         new Body()
         {
             name    = "Jupiter",
             stdGrav = 1.26686535e17,
             radius  = 69911e3,
             color   = new Vector3(0.7189596667682617, 0.6638891549711422, 0.6361916372766723)
         },
         new Body()
         {
             name    = "Saturn",
             stdGrav = 3.7931188e16,
             radius  = 58232e3,
             color   = new Vector3(0.8246372253577235, 0.7470193676770795, 0.59518943574319)
         },
         new Body()
         {
             name    = "Uranus",
             stdGrav = 5.793940e15,
             radius  = 25362e3,
             color   = new Vector3(0.565224110171928, 0.7359458915531022, 0.8092590995342418)
         },
         new Body()
         {
             name    = "Neptune",
             stdGrav = 6.836530e15,
             radius  = 24622e3,
             color   = new Vector3(0.5525244704623422, 0.7383866805149026, 0.868736820570925)
         },
         new Body()
         {
             name    = "Pluto",
             stdGrav = 8.72e11,
             radius  = 1186e3,
             color   = new Vector3(0.732870760490961, 0.6071190239708979, 0.4988704626052213)
         }
     };
     solar_system = new PlanetarySystem(new List <Body>()
     {
         // All radii are multiplied by 100
         // Colors from https://planetarium.madison.k12.wi.us/planets-true.htm
         // Radii from https://en.wikipedia.org/wiki/List_of_Solar_System_objects_by_size
         (Body)sun.Clone(),
         new Body(sun, solar_system_elements[0])
         {
             name    = "Mercury",
             stdGrav = 2.2033e13,
             radius  = 2439.7e3,
             color   = new Vector3(0.5604629613577541, 0.5506810776290613, 0.5615709550944886)
         },
         new Body(sun, solar_system_elements[1])
         {
             name    = "Venus",
             stdGrav = 3.24860e14,
             radius  = 6051.8e3,
             color   = new Vector3(0.7290057613658241, 0.7163768245238121, 0.6791579213171579)
         },
         new Body(sun, solar_system_elements[2])
         {
             name    = "Earth",
             stdGrav = 3.986004419e14,
             radius  = 6371.0e3,
             color   = new Vector3(0.36141510867913057, 0.3805593555251558, 0.4684865790976585)
         },
         new Body(sun, solar_system_elements[3])
         {
             name    = "Mars",
             stdGrav = 4.282837e13,
             radius  = 3389.5e3,
             color   = new Vector3(0.5128845217545257, 0.3367414685964679, 0.2022838932412694)
         },
         new Body(sun, solar_system_elements[4])
         {
             name    = "Jupiter",
             stdGrav = 1.26686535e17,
             radius  = 69911e3,
             color   = new Vector3(0.7189596667682617, 0.6638891549711422, 0.6361916372766723)
         },
         new Body(sun, solar_system_elements[5])
         {
             name    = "Saturn",
             stdGrav = 3.7931188e16,
             radius  = 58232e3,
             color   = new Vector3(0.8246372253577235, 0.7470193676770795, 0.59518943574319)
         },
         new Body(sun, solar_system_elements[6])
         {
             name    = "Uranus",
             stdGrav = 5.793940e15,
             radius  = 25362e3,
             color   = new Vector3(0.565224110171928, 0.7359458915531022, 0.8092590995342418)
         },
         new Body(sun, solar_system_elements[7])
         {
             name    = "Neptune",
             stdGrav = 6.836530e15,
             radius  = 24622e3,
             color   = new Vector3(0.5525244704623422, 0.7383866805149026, 0.868736820570925)
         },
         new Body(sun, solar_system_elements[8])
         {
             name    = "Pluto",
             stdGrav = 8.72e11,
             radius  = 1186e3,
             color   = new Vector3(0.732870760490961, 0.6071190239708979, 0.4988704626052213)
         }
     });
 }