예제 #1
0
 /// <summary>
 /// Lässt das Insekt von der aktuellen Position aus die angegebene
 /// Entfernung in Schritten entgegen der Richtung zu einer Quelle gehen.
 /// Wenn die Quelle ein Insekt eines anderen Volkes ist, befindet sich das
 /// Insekt auf der Flucht.
 /// </summary>
 /// <param name="quelle">Die Quelle.</param>
 /// <param name="entfernung">Die Entfernung in Schritten.</param>
 internal void GeheWegVonBase(ICoordinate quelle, int entfernung)
 {
     DreheInRichtungBase(CoreCoordinate.BestimmeRichtung(this, quelle) + 180);
     GeheGeradeausBase(entfernung);
 }
예제 #2
0
        /// <summary>
        /// Berechnet die Bewegung des Insekts.
        /// </summary>
        internal void Bewegen()
        {
            reached = false;

            // Insekt dreht sich.
            if (restWinkel != 0)
            {
                // Zielwinkel wird erreicht.
                if (Math.Abs(restWinkel) < colony.Drehgeschwindigkeit[CasteIndexBase])
                {
                    koordinate.Richtung += restWinkel;
                    restWinkel           = 0;
                }

                // Insekt dreht sich nach rechts.
                else if (restWinkel >= colony.Drehgeschwindigkeit[CasteIndexBase])
                {
                    koordinate.Richtung += colony.Drehgeschwindigkeit[CasteIndexBase];
                    RestWinkelBase      -= colony.Drehgeschwindigkeit[CasteIndexBase];
                }

                // Insekt dreht sich nach links.
                else if (restWinkel <= -colony.Drehgeschwindigkeit[CasteIndexBase])
                {
                    koordinate.Richtung -= colony.Drehgeschwindigkeit[CasteIndexBase];
                    RestWinkelBase      += colony.Drehgeschwindigkeit[CasteIndexBase];
                }
            }

            // Insekt geht.
            else if (restStreckeI > 0)
            {
                if (GetragenesObstBase == null)
                {
                    int strecke = Math.Min(restStreckeI, aktuelleGeschwindigkeitI);

                    restStreckeI          -= strecke;
                    zurückgelegteStreckeI += strecke;
                    koordinate.X          += SimulationEnvironment.Cos[strecke, koordinate.Richtung];
                    koordinate.Y          += SimulationEnvironment.Sin[strecke, koordinate.Richtung];
                }
            }

            // Insekt geht auf Ziel zu.
            else if (ziel != null)
            {
                int entfernungI;

                if (ZielBase is CoreMarker)
                {
                    entfernungI = CoreCoordinate.BestimmeEntfernungDerMittelpunkteI(koordinate, ziel.CoordinateBase);
                }
                else
                {
                    entfernungI = CoreCoordinate.BestimmeEntfernungI(koordinate, ziel.CoordinateBase);
                }

                reached = entfernungI <= SimulationEnvironment.PLAYGROUND_UNIT;
                if (!reached)
                {
                    int richtung = CoreCoordinate.BestimmeRichtung(koordinate, ziel.CoordinateBase);

                    // Ziel ist in Sichtweite oder Insekt trägt Obst.
                    if (entfernungI < colony.SichtweiteI[CasteIndexBase] || getragenesObst != null)
                    {
                        restStreckeI = entfernungI;
                    }

                    // Ansonsten Richtung verfälschen.
                    else
                    {
                        richtung    += RandomBase.Next(-18, 18);
                        restStreckeI = colony.SichtweiteI[CasteIndexBase];
                    }

                    dreheInRichtung(richtung);
                }
            }

            // Koordinaten links begrenzen.
            if (koordinate.X < 0)
            {
                koordinate.X = -koordinate.X;
                if (koordinate.Richtung > 90 && koordinate.Richtung <= 180)
                {
                    koordinate.Richtung = 180 - koordinate.Richtung;
                }
                else if (koordinate.Richtung > 180 && koordinate.Richtung < 270)
                {
                    koordinate.Richtung = 540 - koordinate.Richtung;
                }
            }

            // Koordinaten rechts begrenzen.
            else if (koordinate.X > colony.BreiteI)
            {
                koordinate.X = colony.BreiteI2 - koordinate.X;
                if (koordinate.Richtung >= 0 && koordinate.Richtung < 90)
                {
                    koordinate.Richtung = 180 - koordinate.Richtung;
                }
                else if (koordinate.Richtung > 270 && koordinate.Richtung < 360)
                {
                    koordinate.Richtung = 540 - koordinate.Richtung;
                }
            }

            // Koordinaten oben begrenzen.
            if (koordinate.Y < 0)
            {
                koordinate.Y = -koordinate.Y;
                if (koordinate.Richtung > 180 && koordinate.Richtung < 360)
                {
                    koordinate.Richtung = 360 - koordinate.Richtung;
                }
            }

            // Koordinaten unten begrenzen.
            else if (koordinate.Y > colony.HöheI)
            {
                koordinate.Y = colony.HöheI2 - koordinate.Y;
                if (koordinate.Richtung > 0 && koordinate.Richtung < 180)
                {
                    koordinate.Richtung = 360 - koordinate.Richtung;
                }
            }
        }
예제 #3
0
 /// <summary>
 /// Dreht das Insekt in die Richtung des angegebenen Ziels.
 /// </summary>
 /// <param name="ziel">Ziel</param>
 internal void DreheZuZielBase(ICoordinate ziel)
 {
     DreheInRichtungBase(CoreCoordinate.BestimmeRichtung(this, ziel));
 }