Classes used to build the computational domain¶
Destination class used to build a destination¶
- class cromosim.domain.Destination(name, colors, excluded_colors=[], desired_velocity_from_color=[], fmm_speed=None, velocity_scale=1, next_destination=None, next_domain=None, next_transit_box=None)[source]¶
Bases:
object
A Destination object contains all the information necessary to direct people to a goal, for example a door, a staircase or another floor.
- Attributes:
- name: string
name of the destination
- colors: list
List of colors
[ [r,g,b],... ]
drawing the destination. For example, a door can be represented by a red line.- excluded_colors: list
List of colors
[ [r,g,b],... ]
representing obstacles that cannot be crossed for someone wishing to go to this destination: the walls of course, but possibly another objects only visible to the people concerned by this destination.- desired_velocity_from_color: list
Allows you to associate a desired velocity (vx, vy) with a color (r, g, b):
[ [r,g,b, vx,vy],... ]
.- fmm_speed: numpy array
To automatically calculate the desired velocity leading to this destination, a Fast-Marching method is used to calculate the travel time to this destination. The opposite of the gradient of this time gives the desired velocity. This method solves the Eikonal equation
|grad D| = 1/fmm_speed
. By changing thefmm_speed
(1 everywhere by default) you can make certain areas slower and thus modify the desired velocity to divert people- velocity_scale: float
Multiplying coefficient used in front of the desired velocity vector (which is renormalized). For example on a staircase one may wish to reduce the speed of people.
- next_destination: string
Name of the next destination. Useful for linking destinations one after the other
- next_domain: string
Name of the next domain where is the next_destination
- next_transit_box: list
The people in the current domain present in this box will be duplicated in the next_domain. A box is defined by four points:
[x0, y0, x1, y1, x2, y2, x3, y3]
- distance: numpy array
Distance (if
fmm_speed
== 1) or travel time (iffmm_speed
!= 1) to the destination- desired_velocity_X: numpy array
First component of the desired velocity
- desired_velocity_Y: numpy array
Second component of the desired velocity
Examples
- Examples with one destination:
cromosim/examples/domain/domain_room.py
cromosim/examples/domain/domain_stadium.py
- Example with several destinations:
cromosim/examples/domain/domain_shibuya_crossing.py
- Example with a destination described in a json file
cromosim/examples/domain/domain_from_json.py
Domain class used to build the computational domain¶
- class cromosim.domain.Domain(name='Domain', background='White', pixel_size=1.0, xmin=0.0, width=100, ymin=0.0, height=100, wall_colors=[[0, 0, 0]], npzfile=None)[source]¶
Bases:
object
- To define the computational domain:
a background: empty (white) or a PNG image which only contains the colors white, red (for the doors) and black (for the walls)
- supplementary doors represented by matplotlib shapes:
line2D
- supplementary walls represented by matplotlib shapes:
line2D
,circle
,ellipse
,rectangle
orpolygon
To compute the obstacle distances and the desired velocities
- Attributes:
- pixel_size: float
size of a pixel in meters
- width: int
width of the background image (number of pixels)
- height: int
height of the background image (number of pixels)
- xmin: float
x coordinate of the origin (bottom left corner)
- xmax: float
xmax = xmin + width*pixel_size
- ymin: float
y coordinate of the origin (bottom left corner)
- ymax: float
ymax = ymin + height*pixel_size
- X: numpy array
x coordinates (meshgrid)
- Y: numpy array
y coordinates (meshgrid)
- image: numpy array
pixel array (r,g,b,a) The Pillow image is converted to a numpy arrays, then using
flipud
the origin of the image is put it down left instead the top left- image_red: numpy array
red values of the image (r,g,b,a)
- image_green: numpy array
green values of the image (r,g,b,a)
- image_blue: numpy array
blue values of the image (r,g,b,a)
- wall_mask: numpy array
boolean array: true for wall pixels
- wall_mask_id: numpy array
wall pixel indices
- wall_distance: numpy array
distance (m) to the wall
- wall_grad_X: numpy array
gradient of the distance to the wall (first component)
- wall_grad_Y: numpy array
gradient of the distance to the wall (second component)
- door_distance: numpy array
distance (m) to the door
- desired_velocity_X: numpy array
- opposite of the gradient of the distance to the door: desired velocity
(first component)
- desired_velocity_Y: numpy array
opposite of the gradient of the distance to the door: desired velocity (second component)
Methods
add_destination
(dest)To compute the desired velocities to this destination and then to add this Destination object to this domain.
add_shape
(shape[, outline_color, fill_color])To add a matplotlib shape:
line2D
,circle
,ellipse
,rectangle
orpolygon
To build the domain: reads the background image (if supplied) and initializes all the color arrrays
To compute the geodesic distance to the walls in using a fast-marching method
people_desired_velocity
(xyr, people_dest[, ...])This function determines people desired velocities from the desired velocity array computed by Domain thanks to a fast-marching method.
people_target_distance
(xyr, people_dest[, ...])This function determines distances to the current target for all people
people_wall_distance
(xyr[, II, JJ])This function determines distances to the nearest wall for all people
plot
([id, title, savefig, filename, dpi])To plot the computational domain
plot_desired_velocity
(destination_name[, ...])To plot the desired velocity
plot_wall_dist
([step, scale, scale_units, ...])To plot the wall distances
save
(outfile)To save the content of the domain in a file
Examples
- A simple room
cromosim/examples/domain/domain_room.py
- A circular domain
cromosim/examples/domain/domain_stadium.py
- A domain with several destinations
cromosim/examples/domain/domain_shibuya_crossing.py
- A domain built from json file (where is its description)
cromosim/examples/domain/domain_from_json.py
- add_destination(dest)[source]¶
To compute the desired velocities to this destination and then to add this Destination object to this domain.
- Parameters:
- dest: Destination
contains the Destination object which must be added to this domain
- add_shape(shape, outline_color=[0, 0, 0], fill_color=[255, 255, 255])[source]¶
To add a matplotlib shape:
line2D
,circle
,ellipse
,rectangle
orpolygon
- Parameters:
- shape: matplotlib shape
line2D, circle, ellipse, rectangle or polygon
- outline_color: list
rgb color
- fill_color: list
rgb color
- build_domain()[source]¶
To build the domain: reads the background image (if supplied) and initializes all the color arrrays
- compute_wall_distance()[source]¶
To compute the geodesic distance to the walls in using a fast-marching method
- people_desired_velocity(xyr, people_dest, II=None, JJ=None)[source]¶
This function determines people desired velocities from the desired velocity array computed by Domain thanks to a fast-marching method.
- Parameters:
- xyr: numpy array
people coordinates and radius: x,y,r
- people_dest: list of string
destination for each individual
- II: numpy array (None by default)
people index i
- JJ: numpy array (None by default)
people index j
- Returns:
- II: numpy array
people index i
- JJ: numpy array
people index j
- Vd: numpy array
people desired velocity
- people_target_distance(xyr, people_dest, II=None, JJ=None)[source]¶
This function determines distances to the current target for all people
- Parameters:
- xyr: numpy array
people coordinates and radius:
x,y,r
- people_dest: list of string
destination for each individual
- II: numpy array (None by default)
people index
i
- JJ: numpy array (None by default)
people index
j
- Returns
- ——-
- II: numpy array
people index i
- JJ: numpy array
people index j
- D: numpy array
distances to the current target
- people_wall_distance(xyr, II=None, JJ=None)[source]¶
This function determines distances to the nearest wall for all people
- Parameters:
- xyr: numpy array
people coordinates and radius:
x,y,r
- II: numpy array (None by default)
people index
i
- JJ: numpy array (None by default)
people index
j
- Returns:
- II: numpy array
people index
i
- JJ: numpy array
people index
j
- D: numpy array
distances to the nearest wall
- plot(id=1, title='', savefig=False, filename='fig.png', dpi=150)[source]¶
To plot the computational domain
- Parameters:
- id: integer
Figure id (number)
- title: string
Figure title
- savefig: boolean
writes the figure as a png file if true
- filename: string
png filename used to write the figure
- dpi: integer
number of pixel per inch for the saved figure
- plot_desired_velocity(destination_name, step=10, scale=10, scale_units='inches', id=1, title='', savefig=False, filename='fig.png', dpi=150)[source]¶
To plot the desired velocity
- Parameters:
- destination_name: string
name of the considered destination
- step: integer
draw an arrow every step pixels
- scale: integer
scaling for the quiver arrows
- scale_units: string
unit name for quiver arrow scaling
- id: integer
Figure id (number)
- title: string
Figure title
- savefig: boolean
writes the figure as a png file if true
- filename: string
png filename used to write the figure
- dpi: integer
number of pixel per inch for the saved figure
- plot_wall_dist(step=10, scale=10, scale_units='inches', id=1, title='', savefig=False, filename='fig.png', dpi=150)[source]¶
To plot the wall distances
- Parameters:
- id: integer
Figure id (number)
- title: string
Figure title
- savefig: boolean
writes the figure as a png file if true
- filename: string
png filename used to write the figure
- dpi: integer
number of pixel per inch for the saved figure