buildgraph: build collections matrix for each room and save it
This commit is contained in:
parent
2bb89f4c1a
commit
a7f85ee2df
3 changed files with 22 additions and 3 deletions
|
@ -65,7 +65,7 @@ class Graph:
|
|||
print('%d points' % len(self.points))
|
||||
print('%d rooms' % sum(len(level.rooms) for level in self.levels.values()))
|
||||
print('%d level transfer points' % len(self.level_transfer_points))
|
||||
print('%d connections' % sum(len(point.connections) for point in self.points))
|
||||
print('%d connections' % sum(level.connection_count() for level in self.levels.values()))
|
||||
|
||||
def add_levelconnector_point(self, levelconnector, point):
|
||||
self._built_levelconnector_points.setdefault(levelconnector.name, []).append(point)
|
||||
|
|
|
@ -61,6 +61,9 @@ class GraphLevel():
|
|||
print('%d points' % len(self._built_points))
|
||||
print('%d room transfer points' % len(self._built_room_transfer_points))
|
||||
|
||||
def connection_count(self):
|
||||
return sum(room.connection_count() for room in self.rooms)
|
||||
|
||||
def collect_rooms(self):
|
||||
accessibles = self.level.geometries.accessible
|
||||
accessibles = assert_multipolygon(accessibles)
|
||||
|
|
|
@ -20,6 +20,7 @@ class GraphRoom():
|
|||
self.areas = []
|
||||
self.points = None
|
||||
self.room_transfer_points = None
|
||||
self.distances = np.zeros((1, ))
|
||||
|
||||
def serialize(self):
|
||||
return (
|
||||
|
@ -27,12 +28,13 @@ class GraphRoom():
|
|||
[area.serialize() for area in self.areas],
|
||||
self.points,
|
||||
self.room_transfer_points,
|
||||
self.distances,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def unserialize(cls, level, data):
|
||||
room = cls(level)
|
||||
room.mpl_clear, areas, room.points, room.room_transfer_points = data
|
||||
room.mpl_clear, areas, room.points, room.room_transfer_points, room.distances = data
|
||||
room.areas = tuple(GraphArea(room, *area) for area in areas)
|
||||
return room
|
||||
|
||||
|
@ -177,13 +179,27 @@ class GraphRoom():
|
|||
|
||||
def build_connections(self):
|
||||
for area in self.areas:
|
||||
area.build_connections()
|
||||
pass # area.build_connections()
|
||||
|
||||
def connection_count(self):
|
||||
# print(np.count_nonzero(self.distances != np.inf))
|
||||
return np.count_nonzero(self.distances != np.inf)
|
||||
|
||||
def finish_build(self):
|
||||
self.areas = tuple(self.areas)
|
||||
self.points = np.array(tuple(point.i for point in self._built_points))
|
||||
self.room_transfer_points = np.array(tuple(i for i in self.points if i in self.level.room_transfer_points))
|
||||
|
||||
mapping = {from_i: to_i for to_i, from_i in enumerate(self.points)}
|
||||
|
||||
self.distances = np.empty(shape=(len(self.points), len(self.points)), dtype=np.float16)
|
||||
self.distances[:] = np.inf
|
||||
|
||||
for from_point in self._built_points:
|
||||
for to_point, connection in from_point.connections.items():
|
||||
if to_point.i in mapping:
|
||||
self.distances[mapping[from_point.i], mapping[to_point.i]] = connection.distance
|
||||
|
||||
for area in self.areas:
|
||||
area.finish_build()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue