/// <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); }
/// <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; } } }
/// <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)); }