from mesa.examples.basic.boid_flockers.model import BoidFlockers
from mesa.visualization import Slider, SolaraViz, make_space_component
import numpy as np
def boid_draw(agent):
# calculate angle according to directions [x,y]
directions = agent.direction
angle = np.arctan2(directions[1], directions[0])
angle = np.degrees(angle)
angle = (angle + 360) % 360
# define the marker as triangle
# bird = {"size": 20, "marker": (3, 1, angle)}
bird = {"size": 20}
neighbors = len(agent.neighbors)
if neighbors <= 1:
bird.update({"color": "red"})
elif neighbors >= 2:
bird.update({"color": "green"})
return bird
model_params = {
"seed": {
"type": "InputText",
"value": 42,
"label": "Random Seed",
},
"population": Slider(
label="Number of boids",
value=100,
min=10,
max=200,
step=10,
),
"width": 100,
"height": 100,
"speed": Slider(
label="Speed of Boids",
value=5,
min=1,
max=20,
step=1,
),
"vision": Slider(
label="Vision of Bird (radius)",
value=10,
min=1,
max=50,
step=1,
),
"separation": Slider(
label="Minimum Separation",
value=2,
min=1,
max=20,
step=1,
),
}
model = BoidFlockers()
page = SolaraViz(
model,
components=[make_space_component(agent_portrayal=boid_draw, backend="matplotlib")],
model_params=model_params,
name="Boid Flocking Model",
play_interval=100,
)
page # noqa