Source code for jupedsim.routing

# Copyright © 2012-2023 Forschungszentrum Jülich GmbH
# SPDX-License-Identifier: LGPL-3.0-or-later

from typing import Any

import shapely

import jupedsim.native as py_jps
from jupedsim.geometry_utils import build_geometry


[docs]class RoutingEngine: """RoutingEngine to compute the shortest paths with navigation meshes.""" def __init__( self, geometry: str | shapely.GeometryCollection | shapely.Polygon | shapely.MultiPolygon | shapely.MultiPoint | list[tuple[float, float]], **kwargs: Any, ) -> None: self._obj = py_jps.RoutingEngine( build_geometry(geometry, *kwargs)._obj )
[docs] def compute_waypoints( self, frm: tuple[float, float], to: tuple[float, float] ) -> list[tuple[float, float]]: """Computes shortest path between specified points. Arguments: geometry: Data to create the geometry out of. Data may be supplied as: * list of 2d points describing the outer boundary, holes may be added with use of `excluded_areas` kw-argument * :class:`~shapely.GeometryCollection` consisting only out of :class:`Polygons <shapely.Polygon>`, :class:`MultiPolygons <shapely.MultiPolygon>` and :class:`MultiPoints <shapely.MultiPoint>` * :class:`~shapely.MultiPolygon` * :class:`~shapely.Polygon` * :class:`~shapely.MultiPoint` forming a "simple" polygon when points are interpreted as linear ring without repetition of the start/end point. * str with a valid Well Known Text. In this format the same WKT types as mentioned for the shapely types are supported: GEOMETRYCOLLETION, MULTIPOLYGON, POLYGON, MULTIPOINT. The same restrictions as mentioned for the shapely types apply. frm: point from which to find the shortest path to: point to which to find the shortest path Keyword Arguments: excluded_areas: describes exclusions from the walkable area. Only use this argument if `geometry` was provided as list[tuple[float, float]]. Returns: List of points (path) from 'frm' to 'to' including from and to. """ return self._obj.compute_waypoints(frm, to)
[docs] def is_routable(self, p: tuple[float, float]) -> bool: """Tests if the supplied point is inside the underlying geometry. Returns: If the point is inside the geometry. """ return self._obj.is_routable(p)
[docs] def mesh( self, ) -> list[ tuple[tuple[float, float], tuple[float, float], tuple[float, float]] ]: """Access the navigation mesh geometry. The navigation mesh is store as a collection of triangles in CCW order. Returns: The triangles composing the navigation mesh. Each triangle is encoded as 3-tuple of points. """ return self._obj.mesh()
[docs] def edges_for(self, vertex_id: int): return self._obj.edges_for(vertex_id)