def add_non_overlapping_group(self, group, position_gen, obstacles=None):
"""Add group of agents
Args:
group (AgentGroup):
position_gen (Generator|Callable):
obstacles (numpy.ndarray):
"""
if self.agent_type is not group.agent_type:
raise CrowdDynamicsException
# resize self.array to fit new agents
array = np.zeros(group.size, dtype=group.agent_type.dtype())
self.array = np.concatenate((self.array, array))
index = 0
overlaps = 0
overlaps_max = 10 * group.size
while index < group.size and overlaps < overlaps_max:
new_agent = group.members[index]
new_agent.position = position_gen() if callable(position_gen) \
else next(position_gen)
# Overlapping check
neighbours = self._neighbours.nearest(new_agent.position, radius=1)
if new_agent.overlapping(self.array[neighbours]):
# Agent is overlapping other agent.
overlaps += 1
continue
if obstacles is not None and new_agent.overlapping_obstacles(obstacles):
# Agent is overlapping with an obstacle.
overlaps += 1
continue
# Agent can be successfully placed
self.array[self.index] = np.array(new_agent)
self._neighbours[new_agent.position] = self.index
self.index += 1
index += 1
# TODO: remove agents that didn't fit from self.array
if self.index + 1 < self.array.size:
pass
# Array should remain contiguous
assert self.array.flags.c_contiguous
评论列表
文章目录