Пример #1
0
        private void setOrbitButon_Click(object sender, EventArgs e)
        {
            try
            {
                double coveredAngle = 0;
                try
                {
                    coveredAngle = double.Parse(setOrbitCoveredAngleBox.Text);
                }
                catch (Exception exc)
                { }
                double orbitParameter = MathUtilities.ParseFromExpNotation(
                    double.Parse(setOrbitParameterBox.Text),
                    int.Parse(setOrbitParameterEBox.Text));
                if (selectedBody is Planet)
                {
                    Planet planet = (Planet)selectedBody;
                    if (setOrbitRadiusRadio.Checked)
                    {
                        Vector startingVelocity = new Vector(planet.Velocity);
                        PlanetSystem.Models.Utilities.Point startingPoint = new PlanetSystem.Models.Utilities.Point(planet.Center);
                        if (setOrbitRadiusRadio.Checked)
                        {
                            Physics.EnterOrbitByGivenRadius(ref planet, currentPlanetarySystem.Star, orbitParameter, coveredAngle);
                        }
                        else
                        {
                            Physics.EnterOrbitByGivenSpeed(ref planet, currentPlanetarySystem.Star, orbitParameter, coveredAngle);
                        }
                        Vector deltaVelocity = planet.Velocity - startingVelocity;
                        PlanetSystem.Models.Utilities.Point deltaPoint = planet.Center - startingPoint;
                        planet.Moons.ToList().ForEach(m =>
                        {
                            Physics.AddVelocityToBody(ref m, deltaVelocity);
                            m.Center = new PlanetSystem.Models.Utilities.Point(
                                m.Center.X + deltaPoint.X,
                                m.Center.Y + deltaPoint.Y,
                                m.Center.X + deltaPoint.Z
                                );
                        });
                    }
                    else
                    {
                        Vector startingVelocity = new Vector(planet.Velocity);
                        PlanetSystem.Models.Utilities.Point startingPoint = new PlanetSystem.Models.Utilities.Point(planet.Center);
                        if (setOrbitRadiusRadio.Checked)
                        {
                            Physics.EnterOrbitByGivenSpeed(ref planet, currentPlanetarySystem.Star, orbitParameter, coveredAngle);
                        }
                        else
                        {
                            Physics.EnterOrbitByGivenSpeed(ref planet, currentPlanetarySystem.Star, orbitParameter, coveredAngle);
                        }
                        Vector deltaVelocity = planet.Velocity - startingVelocity;
                        PlanetSystem.Models.Utilities.Point deltaPoint = planet.Center - startingPoint;
                        planet.Moons.ToList().ForEach(m =>
                        {
                            Physics.AddVelocityToBody(ref m, deltaVelocity);
                            m.Center = new PlanetSystem.Models.Utilities.Point(
                                m.Center.X + deltaPoint.X,
                                m.Center.Y + deltaPoint.Y,
                                m.Center.X + deltaPoint.Z
                                );
                        });
                    }
                }
                else if (selectedBody is Moon)
                {
                    Moon moon = (Moon)selectedBody;
                    if (setOrbitRadiusRadio.Checked)
                    {
                        Physics.EnterOrbitByGivenRadius(ref moon, moon.Planet, orbitParameter, coveredAngle);
                    }
                    else
                    {
                        Physics.EnterOrbitByGivenSpeed(ref moon, moon.Planet, orbitParameter, coveredAngle);
                    }
                }
                else if (selectedBody is Asteroid)
                {
                    Asteroid asteroid     = (Asteroid)selectedBody;
                    var      bodies       = currentPlanetarySystem.GetAllBodies();
                    var      primaryQuery = from p in bodies
                                            where p.Name == setOrbitPrimeBox.SelectedText
                                            select p;

                    AstronomicalBody primary = primaryQuery.FirstOrDefault();
                    if (setOrbitRadiusRadio.Checked)
                    {
                        Physics.EnterOrbitByGivenRadius(ref asteroid, primary, orbitParameter, coveredAngle);
                    }
                    else
                    {
                        Physics.EnterOrbitByGivenSpeed(ref asteroid, primary, orbitParameter, coveredAngle);
                    }
                }
                else if (selectedBody is ArtificialObject)
                {
                    ArtificialObject artificialObject = (ArtificialObject)selectedBody;
                    var bodies       = currentPlanetarySystem.GetAllBodies();
                    var primaryQuery = from p in bodies
                                       where p.Name == setOrbitPrimeBox.SelectedText
                                       select p;

                    AstronomicalBody primary = primaryQuery.FirstOrDefault();
                    if (setOrbitRadiusRadio.Checked)
                    {
                        Physics.EnterOrbitByGivenRadius(ref artificialObject, primary, orbitParameter, coveredAngle);
                    }
                    else
                    {
                        Physics.EnterOrbitByGivenSpeed(ref artificialObject, primary, orbitParameter, coveredAngle);
                    }
                }
                else
                {
                    var bodies       = currentPlanetarySystem.GetAllBodies();
                    var primaryQuery = from p in bodies
                                       where p.Name == setOrbitPrimeBox.SelectedText
                                       select p;

                    AstronomicalBody primary = primaryQuery.FirstOrDefault();
                    if (setOrbitRadiusRadio.Checked)
                    {
                        Physics.EnterOrbitByGivenRadius(ref selectedBody, primary, orbitParameter, coveredAngle);
                    }
                    else
                    {
                        Physics.EnterOrbitByGivenSpeed(ref selectedBody, primary, orbitParameter, coveredAngle);
                    }
                }
                Refresh();
            }
            catch (Exception exc)
            {
            }
        }