зеркало из
https://github.com/docxology/cognitive.git
synced 2025-10-30 04:36:05 +02:00
Delete renderer.py
Этот коммит содержится в:
родитель
2dfc858730
Коммит
8873f16966
@ -1,126 +0,0 @@
|
|||||||
"""
|
|
||||||
Visualization module for the ant colony simulation using matplotlib.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
from matplotlib.patches import Circle, Wedge
|
|
||||||
from matplotlib.collections import PatchCollection
|
|
||||||
import matplotlib.animation as animation
|
|
||||||
|
|
||||||
class SimulationRenderer:
|
|
||||||
"""Handles visualization of the ant colony simulation."""
|
|
||||||
|
|
||||||
def __init__(self, config: dict):
|
|
||||||
"""Initialize the renderer with configuration settings."""
|
|
||||||
self.config = config
|
|
||||||
self.viz_config = config['visualization']
|
|
||||||
self.env_size = config['environment']['size']
|
|
||||||
|
|
||||||
# Setup the figure and axis
|
|
||||||
self.fig, self.ax = plt.subplots(figsize=(10, 10))
|
|
||||||
self.ax.set_xlim(0, self.env_size[0])
|
|
||||||
self.ax.set_ylim(0, self.env_size[1])
|
|
||||||
self.ax.set_aspect('equal')
|
|
||||||
|
|
||||||
# Initialize collections for different elements
|
|
||||||
self.agent_patches = []
|
|
||||||
self.food_patches = []
|
|
||||||
self.obstacle_patches = []
|
|
||||||
self.pheromone_plots = {}
|
|
||||||
|
|
||||||
# Setup the nest
|
|
||||||
nest_loc = config['environment']['nest_location']
|
|
||||||
nest = Circle(nest_loc, 5, color=self.viz_config['colors']['nest'])
|
|
||||||
self.ax.add_patch(nest)
|
|
||||||
|
|
||||||
def update(self, world_state: dict) -> None:
|
|
||||||
"""Update the visualization with current world state."""
|
|
||||||
# Clear previous patches
|
|
||||||
for patch in self.agent_patches + self.food_patches + self.obstacle_patches:
|
|
||||||
patch.remove()
|
|
||||||
self.agent_patches.clear()
|
|
||||||
self.food_patches.clear()
|
|
||||||
self.obstacle_patches.clear()
|
|
||||||
|
|
||||||
# Update pheromones
|
|
||||||
for p_type, grid in world_state['pheromones'].items():
|
|
||||||
if p_type not in self.pheromone_plots:
|
|
||||||
color = self.viz_config['colors']['pheromones'][p_type]
|
|
||||||
self.pheromone_plots[p_type] = self.ax.imshow(
|
|
||||||
grid,
|
|
||||||
extent=[0, self.env_size[0], 0, self.env_size[1]],
|
|
||||||
cmap='Greens' if p_type == 'food' else 'Reds',
|
|
||||||
alpha=0.3,
|
|
||||||
vmin=0,
|
|
||||||
vmax=1
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.pheromone_plots[p_type].set_array(grid)
|
|
||||||
|
|
||||||
# Draw agents
|
|
||||||
for agent in world_state['agents']:
|
|
||||||
color = self.viz_config['colors']['agents'][agent.current_task.value]
|
|
||||||
agent_patch = self._create_agent_patch(agent, color)
|
|
||||||
self.ax.add_patch(agent_patch)
|
|
||||||
self.agent_patches.append(agent_patch)
|
|
||||||
|
|
||||||
# Draw food sources
|
|
||||||
for food in world_state['resources']:
|
|
||||||
food_patch = Circle(
|
|
||||||
(food.position.x, food.position.y),
|
|
||||||
food.size,
|
|
||||||
color=self.viz_config['colors']['food']
|
|
||||||
)
|
|
||||||
self.ax.add_patch(food_patch)
|
|
||||||
self.food_patches.append(food_patch)
|
|
||||||
|
|
||||||
# Draw obstacles
|
|
||||||
for obstacle in world_state['obstacles']:
|
|
||||||
obstacle_patch = Circle(
|
|
||||||
(obstacle.position.x, obstacle.position.y),
|
|
||||||
obstacle.size,
|
|
||||||
color=self.viz_config['colors']['obstacles']
|
|
||||||
)
|
|
||||||
self.ax.add_patch(obstacle_patch)
|
|
||||||
self.obstacle_patches.append(obstacle_patch)
|
|
||||||
|
|
||||||
# Trigger redraw
|
|
||||||
if self.viz_config['realtime']['enabled']:
|
|
||||||
self.fig.canvas.draw()
|
|
||||||
self.fig.canvas.flush_events()
|
|
||||||
|
|
||||||
def _create_agent_patch(self, agent, color: str) -> Wedge:
|
|
||||||
"""Create a wedge patch to represent an agent."""
|
|
||||||
# Create a wedge shape to show orientation
|
|
||||||
radius = 1.0
|
|
||||||
angle = np.degrees(agent.position.theta)
|
|
||||||
wedge = Wedge(
|
|
||||||
(agent.position.x, agent.position.y),
|
|
||||||
radius,
|
|
||||||
angle - 30, # 60 degree wide wedge
|
|
||||||
angle + 30,
|
|
||||||
color=color
|
|
||||||
)
|
|
||||||
return wedge
|
|
||||||
|
|
||||||
def save_animation(self, frames: list, filename: str) -> None:
|
|
||||||
"""Save the simulation as an animation."""
|
|
||||||
if self.viz_config['recording']['enabled']:
|
|
||||||
anim = animation.ArtistAnimation(
|
|
||||||
self.fig,
|
|
||||||
frames,
|
|
||||||
interval=50,
|
|
||||||
blit=True,
|
|
||||||
repeat=False
|
|
||||||
)
|
|
||||||
anim.save(filename, writer='pillow')
|
|
||||||
|
|
||||||
def show(self) -> None:
|
|
||||||
"""Display the current visualization."""
|
|
||||||
if self.viz_config['realtime']['enabled']:
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
def close(self) -> None:
|
|
||||||
"""Close the visualization window."""
|
|
||||||
plt.close(self.fig)
|
|
||||||
Загрузка…
x
Ссылка в новой задаче
Block a user