Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws2122:boids:boids

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws2122:boids:boids [2022/04/03 20:47]
mak.18 [Zusatz: interaktiver Modus in der 2D-Version (debug mode)]
ws2122:boids:boids [2022/04/03 21:09] (aktuell)
mak.18 [Grundaufbau]
Zeile 48: Zeile 48:
 5. **Positionen aller Boids updaten.** 5. **Positionen aller Boids updaten.**
  
 +Mithilfe von pygame (2D-Version) bzw. vpython (3D-Version) erfolgt dann die Darstellung der Boids auf dem Bildschirm.
 +----
 //​Nachfolgend gezeigte Code-Ausschnitte stammen aus der 2D-Version. Die 3D-Version hat jedoch einen ähnlichen Code.// //​Nachfolgend gezeigte Code-Ausschnitte stammen aus der 2D-Version. Die 3D-Version hat jedoch einen ähnlichen Code.//
 ==== Erzeugung Boids ==== ==== Erzeugung Boids ====
Zeile 78: Zeile 80:
 ==== Target Boids bestimmen ==== ==== Target Boids bestimmen ====
 Nun werden alle vom aktuellen Boid innerhalb des Radius sichtbare Boids bestimmt. Nur diese spielen später bei der Kräfteberechnung eine Rolle. Die Funktion get_target_mask() gibt ein Array zurück. Dabei wird die Liste aller Positionen der Boids als Grundlage genommen und geschaut, ob der Boid der jeweiligen Position innerhalb oder außerhalb des Radius ist. Befindet er sich im Radius, wird sein Wert auf True gesetzt. Da die Positionen innerhalb der Liste gleich bleiben, kann jeder Boid später auf eine Position zurückverfolgt werden. Hierbei wird unterschieden,​ ob es sich beim aktuellen Boid um Boid oder Predator handelt. Handelt es sich um einen Predator wird der betrachtete Radius verdreifacht. Nun werden alle vom aktuellen Boid innerhalb des Radius sichtbare Boids bestimmt. Nur diese spielen später bei der Kräfteberechnung eine Rolle. Die Funktion get_target_mask() gibt ein Array zurück. Dabei wird die Liste aller Positionen der Boids als Grundlage genommen und geschaut, ob der Boid der jeweiligen Position innerhalb oder außerhalb des Radius ist. Befindet er sich im Radius, wird sein Wert auf True gesetzt. Da die Positionen innerhalb der Liste gleich bleiben, kann jeder Boid später auf eine Position zurückverfolgt werden. Hierbei wird unterschieden,​ ob es sich beim aktuellen Boid um Boid oder Predator handelt. Handelt es sich um einen Predator wird der betrachtete Radius verdreifacht.
 +<code python>
 +    def get_target_mask(self,​ current_pos,​ current_vel = np.zeros(2)):​
 +        boid_mask = np.zeros([self.n[0]],​ dtype=bool)
 +...
  
 +        for i in range(self.n[0]):​
 +            if (self.boid_positions[i] != current_pos).all() and np.dot(current_vel,​ self.boid_positions[i] - current_pos) >= 0:
 +                if current_pos in self.pred_positions:​
 +                    boid_mask[i] = np.linalg.norm(self.boid_positions[i] - current_pos) < self.radius * 3
 +                else:
 +                    boid_mask[i] = np.linalg.norm(self.boid_positions[i] - current_pos) < self.radius
 + ...
 +
 +        return (boid_mask, pred_mask, obstacle_mask)
 +
 +</​code>​
 ==== Kräfteberechung ==== ==== Kräfteberechung ====
 Nachdem alle Boids erzeugt wurden können wir mit der eigentlichen Simulation des Schwarmverhaltens beginnen. Jedes Individuum eines Schwarms folgt immer drei bestimmten Regeln - Separation, Kohäsion und Ausrichtung. Alle drei Kräfte ermöglichen zusammen das typische Schwarmverhalten. Bei uns sind die Kräfte Vektoren, die die neue Richtung des aktuellen Boids anzeigen. Nachdem alle Boids erzeugt wurden können wir mit der eigentlichen Simulation des Schwarmverhaltens beginnen. Jedes Individuum eines Schwarms folgt immer drei bestimmten Regeln - Separation, Kohäsion und Ausrichtung. Alle drei Kräfte ermöglichen zusammen das typische Schwarmverhalten. Bei uns sind die Kräfte Vektoren, die die neue Richtung des aktuellen Boids anzeigen.
ws2122/boids/boids.1649011659.txt.gz · Zuletzt geändert: 2022/04/03 20:47 von mak.18