コード例 #1
0
        private Point3 a()
        {
            float distance = Point3.Distance(this.Position, Center.Position);

            Point3 x = new Point3();

            x.assign(Position - Center.Position);

            float fak = (float)(-Center.G * Center.Mass / Math.Pow(distance, 3));

            return(x * fak);
        }
コード例 #2
0
        /// <summary>
        /// Beschleunigung Richtung Bezugsobjekt
        /// </summary>
        /// <param name="o">Bezugsobjekt</param>
        /// <returns></returns>
        private Point3 a(o2Object o)
        {
            float distance = Point3.Distance(this.Position, o.Position);

            Point3 x = new Point3();

            x.assign(Position - o.Position);

            float fak = (float)(-PlanetAdvanced2.G * o.Mass / Math.Pow(distance, 3));

            return(x * fak);
        }
コード例 #3
0
        private void ThreadTick()
        {
            float   distance;
            float   ri;
            float   rj;
            oObject oi;
            oObject oj;

            lock (Objects)
            {
                foreach (oObject o in Objects)
                {
                    o.MoveObject();
                }
                for (int i = 0; i < Objects.Count - 1; i++)
                {
                    for (int j = i + 1; j < Objects.Count; j++)
                    {
                        oi       = Objects[i];
                        oj       = Objects[j];
                        distance = Point3.Distance(oi.Position, oj.Position);
                        ri       = oi.Size;
                        rj       = oj.Size;
                        if (ri + rj > distance)
                        {
                            if (Objects[i] == Sun)
                            {
                                Sun.Mass += oj.Mass;
                                Objects.Remove(oj);
                                break;
                            }
                            else
                            {
                                if (Objects[j] == Sun)
                                {
                                    Sun.Mass += oi.Size;
                                    ;
                                    Objects.Remove(oi);
                                    break;
                                }
                                else
                                {
                                    Objects.Remove(oi);
                                    Objects.Remove(oj);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Fügt einem Zentralobjekt untergeordnete es umkreisende Objekte hinzu
        /// </summary>
        /// <param name="_ZentralObjekt">Dies ist das Zentralobjekt um welches die hinzugefügten kreisen sollen</param>
        /// <param name="cnt">Anzahl der das Zentralobjekt umkreisenden Objekte</param>
        private void AddPlanet(o2Object _ZentralObjekt, int cnt)
        {
            bool SunIsParent = _ZentralObjekt is o2Sun; // ist das Zentralobjekt eine Sonne?

            for (int i = 0; i < cnt; i++)
            {
                float Mass = 1f;
                if (SunIsParent) // Planet
                {
                    int ps = rnd.Next(28, 30);
                    Mass = (float)rnd.NextDouble() * (float)Math.Pow(10, ps) * PlanetAdvanced2.UniFak; // Größe Abhängig von Basisgröße der Planeten
                }
                else // Mond.
                {
                    float f = rnd.Next(80, 1000);   // Faktor um wie viel der Mond kleiner sein soll, als der Körper um den er kreist.
                    Mass = _ZentralObjekt.Mass / f; // Erd-Mond ist ca. 1/81 der Erdmasse. Da er der Größte im Sonnensystem ist, nehm ich das Verhältnis als max. an.
                }

                Point3 Pos      = RndPosToSun(_ZentralObjekt, false, SunIsParent); // Position soll relativ zum Zentralkörper sein
                float  distance = Point3.Distance(_ZentralObjekt.Position, Pos);

                Point3 Dir = MM.MatDotPoint(RotMatrix90z(), Pos - _ZentralObjekt.Position);                    // Richtung 90Grad zum Sonnenwinkel
                Dir.Normalize();
                Dir *= (float)Math.Sqrt(PlanetAdvanced2.G * _ZentralObjekt.Mass / distance);                   // *fak(); // 1. kosmische Geschwindigkeit (Rotation auf Kreisbahn).
                Dir += Dir * ((float)rnd.NextDouble() / 10f);                                                  //* fak()); // ein wenig Varianz, um es interessannt zu machen.
                Dir += _ZentralObjekt.Direction;                                                               // Bewegung der Bezugssonne draufrechnen, damit Sich Planet mitbewegt.
                float[] Color = { (float)rnd.NextDouble(), (float)rnd.NextDouble(), (float)rnd.NextDouble() }; // Farbe ist zufällig

                o2Object p = new o2Object(Pos, Dir, Mass, Color, null);

                Objects.Add(p);
                getList().Add(p);

                if (SunIsParent)
                {
                    int c = rnd.Next(0, 4);
                    AddPlanet(p, c);
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// Eine um die Hauptsonne kreisende Sonne wird erstellt. Diese kann auch größer sein, was sie aber nicht zur Hauptsonne macht.
        /// </summary>
        private void AddSun()
        {
            if (suncount < _Light.Length - 1)
            {
                float  Massfak = (float)rnd.Next(1, 3) * 5 * PlanetAdvanced2.initSunMass;
                float  Mass    = (float)rnd.NextDouble() * Massfak;
                Point3 Pos     = RndPosToSun(Sun, true, false);                  // Zufällige Position bezgl der Sonne

                Point3 Dir = MM.MatDotPoint(RotMatrix90z(), Pos - Sun.Position); // Richtung 90Grad zum SonnenVektor

                Dir.Normalize();                                                 // BewegungsRichtung normalisieren.
                //Dir *= (float)((rnd.NextDouble() * 3) + 2f) * 40f; // Speed zurechnen. Kosmische Gesch. schlug hier immer fehl.

                float distance = Point3.Distance(Sun.Position, Pos);

                Dir *= (float)Math.Sqrt(G * Sun.Mass / distance); // *fak(); // 1. kosmische Geschwindigkeit (Rotation auf Kreisbahn).
                Dir += Sun.Direction;                             // Bewegung der Bezugssonne draufrechnen, damit Sich Planet mitbewegt.

                float[] Color = { (float)rnd.NextDouble(), (float)rnd.NextDouble(), (float)rnd.NextDouble() };
                suncount++; // Sonnenzähler erhöhen. (wichtig für Lichtquellen);
                Objects.Add(new o2Sun(Pos, Dir, Mass, Color, _Light[suncount]));
            }
        }
コード例 #6
0
ファイル: PlanetAdvanced3.cs プロジェクト: indigos33k3r/3dlab
        /// <summary>
        /// eine Simulationsperiode
        /// </summary>
        private void ThreadTick()
        {
            float    distance;
            float    ri;
            float    rj;
            o2Object oi;
            o2Object oj;

            try
            {
                #region Bewegung
                foreach (o2Object o in Objects)
                {
                    o.MoveObject(Objects);
                    if (showTrace)
                    {
                        o.Trace();
                    }
                }
                #endregion
            }
            catch
            { }

            try // Wegen Threading kommt es gern zu Fehlern beim Entfernen von Objekten. Das wird hier abgefangen.
            {   // ist unsauber und langsamer, ich weiß.
                #region Kollision
                // Kollisionsabfrage Schwereres Objekt bekommt Masse von leichterem Objekt
                // und der Impuls des kleineren wird auf den größeren gerechnet.
                // Sonne wird nicht zerstört, da sie Lichtquelle ist.
                for (int i = 0; i < Objects.Count - 1; i++)
                {
                    for (int j = i + 1; j < Objects.Count; j++)
                    {
                        oi       = Objects[i];
                        oj       = Objects[j];
                        distance = Point3.Distance(oi.Position, oj.Position);
                        Point3 impulse = new Point3();
                        ri = oi.Size;
                        rj = oj.Size;
                        if (ri + rj > distance) // Objekte kollidieren ( Summe der Radien > Abstand )
                        {
                            impulse = (oi.Direction * oi.Mass) + (oj.Direction * oj.Mass);
                            if (Objects[i] == Sun) // erstes Objekt ist die HauptSonne - Hauptsonne soll bleiben.
                            {
                                Sun.Mass     += oj.Mass;
                                Sun.Direction = impulse / Sun.Mass;
                                Objects.Remove(oj);
                                ConvertPlanet2Sun(oi);
                                break;
                            }
                            else
                            {
                                if (Objects[j] == Sun) // zweites Objekt ist die Hauptsonne - Hauptsonne soll bleiben
                                {
                                    Sun.Mass     += oi.Mass;
                                    Sun.Direction = impulse / Sun.Mass;
                                    Objects.Remove(oi);
                                    ConvertPlanet2Sun(oj);
                                    break;
                                }
                                else // Kein Objekt ist die Hauptsonne.
                                {
                                    if (oi.Mass > oj.Mass)
                                    {
                                        oi.Mass     += oj.Mass;
                                        oi.Direction = impulse / oi.Mass;
                                        Objects.Remove(oj);
                                        ConvertPlanet2Sun(oi);
                                        break;
                                    }
                                    else
                                    {
                                        oj.Mass     += oi.Mass;
                                        oj.Direction = impulse / oj.Mass;
                                        Objects.Remove(oi);
                                        ConvertPlanet2Sun(oj);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                #endregion
            }
            catch
            { }

            try // Wegen Threading kommt es gern zu Fehlern beim Entfernen von Objekten. Das wird hier abgefangen.
            {   // ist unsauber und langsamer, ich weiß.
                #region zu weit vom Ursprung entfernte Objekte entfernen
                for (int i = Objects.Count - 1; i >= 0; i--)
                {
                    o2Object o = Objects[i];
                    distance = Point3.Distance(new Point3(), o.Position);
                    if (distance > 1000000)
                    {
                        if (o == Sun)
                        {
                            Sun.Direction = new Point3();
                            Sun.Position  = new Point3();
                        }
                        else
                        {
                            Objects.Remove(o);
                        }
                    }
                }
                #endregion
            }
            catch (Exception)
            { }

            if (Sun != null && centered)
            {
                resetSun();
            }
        }
コード例 #7
0
ファイル: Discobobb.cs プロジェクト: indigos33k3r/3dlab
        private void ThreadTick()
        {
            float     distance;
            float     ri;
            float     rj;
            oDBObject oi;
            oDBObject oj;

            lock (Objects)
            {
                foreach (oDBObject o in Objects)
                {
                    o.MoveObject();
                }

                for (int i = 0; i < Objects.Count - 1; i++)
                {
                    for (int j = i + 1; j < Objects.Count; j++)
                    {
                        oi       = Objects[i];
                        oj       = Objects[j];
                        distance = Point3.Distance(oi.Position, oj.Position);
                        ri       = oi.Size;
                        rj       = oj.Size;
                        if (ri + rj > distance)
                        {
                            if (Objects[i] == Sun)
                            {
                                Sun.Mass += oj.Mass;
                                Objects.Remove(oj);
                                break;
                            }
                            else
                            {
                                if (Objects[j] == Sun)
                                {
                                    Sun.Mass += oi.Size;
                                    ;
                                    Objects.Remove(oi);
                                    break;
                                }
                                else
                                {
                                    Objects.Remove(oi);
                                    Objects.Remove(oj);
                                    break;
                                }
                            }
                        }
                    }
                }

                try // Wegen Threading kommt es gern zu Fehlern beim Entfernen von Objekten. Das wird hier abgefangen.
                {   // ist unsauber und langsamer, ich weiß.
                    #region zu weit von der Hauptsonne entfernte Objekte entfernen
                    for (int i = Objects.Count - 1; i >= 0; i--)
                    {
                        oDBObject o = Objects[i];
                        distance = Point3.Distance(Sun.Position, o.Position);
                        if (distance > 300000)
                        {
                            Objects.Remove(o);
                        }
                    }
                    #endregion
                }
                catch (Exception)
                { }
            }
        }