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:45]
mak.18 [Update]
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.
Zeile 156: Zeile 173:
   - die Separationskraft als blaue Linie angezeigt. ​   - die Separationskraft als blaue Linie angezeigt. ​
   - alle einzelnen Kräfte (grau) und die insgesamt wirkende Kraft (grün) angezeigt.   - alle einzelnen Kräfte (grau) und die insgesamt wirkende Kraft (grün) angezeigt.
-Modus 3: Separation {{ :​ws2122:​boids:​boids_separation.png?​200|Modus 3: Separation}} +Modus 3: Separation {{:​ws2122:​boids:​boids_separation.png?​200|Modus 3: Separation}} 
-{{:​ws2122:​boids:​boids_alle_kraefte.png?​200|Modus 4: alle Kräfte}}+{{ :​ws2122:​boids:​boids_alle_kraefte.png?​200|Modus 4: alle Kräfte}}
 Modus 4: alle Kräfte Modus 4: alle Kräfte
  
 In Modus 5 werden die Kräfte wie in Modus 4 dargestellt. Nur diesmal beziehen sie sich nicht auf den Mauszeiger, sondern auf einen Boid. Die Boids bewegen sich in diesem Modus wieder. In Modus 5 werden die Kräfte wie in Modus 4 dargestellt. Nur diesmal beziehen sie sich nicht auf den Mauszeiger, sondern auf einen Boid. Die Boids bewegen sich in diesem Modus wieder.
 +----
 ===== Ergebnis ===== ===== Ergebnis =====
 2D 2D
ws2122/boids/boids.1649011541.txt.gz · Zuletzt geändert: 2022/04/03 20:45 von mak.18