Skip to content

Commit f35af1a

Browse files
author
Jared Strader
committed
clean up repart rooms
1 parent 2c81abb commit f35af1a

File tree

1 file changed

+25
-42
lines changed

1 file changed

+25
-42
lines changed

python/spark_dsg/mp3d.py

Lines changed: 25 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def __init__(self, index, region, vertices, angle_deg=0.0):
192192
rotated_vertices = rotated_vertices[:-1]
193193
self._polygon_xy = shapely.geometry.Polygon(rotated_vertices)
194194

195-
def pos_on_same_floor(self, pos, eps=0):
195+
def pos_on_same_floor(self, pos, eps=0.0):
196196
"""
197197
Check if a 3d position is within z-axis bounds.
198198
@@ -204,30 +204,26 @@ def pos_on_same_floor(self, pos, eps=0):
204204
"""
205205
return (self._min_z - eps) <= pos[2] <= (self._max_z + eps)
206206

207-
def pos_inside_room(self, pos, eps=0):
207+
def pos_inside_room(self, pos, eps=0.0, z_eps=None):
208208
"""
209209
Check if a 3d position falls within the bounds of the room.
210210
211211
Args:
212212
pos (List[float]): 3d position to check
213213
214-
Returns:
214+
Returns:eps
215215
bool: True if position falls inside [min_z, max_z] and polygon bounds
216216
"""
217-
if not self.pos_on_same_floor(pos, eps=eps):
217+
if not self.pos_on_same_floor(pos, eps=eps if z_eps is None else z_eps):
218218
return False, float('inf')
219219

220220
xy_pos = shapely.geometry.Point(pos[0], pos[1])
221221

222-
if eps == 0:
223-
inside = self._polygon_xy.contains(xy_pos)
224-
error = 0 if inside else self._polygon_xy.exterior.distance(xy_pos)
225-
else:
226-
padded_polygon = self._polygon_xy.buffer(eps)
227-
inside = padded_polygon.contains(xy_pos)
228-
error = 0 if inside else padded_polygon.exterior.distance(xy_pos)
222+
if self._polygon_xy.contains(xy_pos):
223+
return True, 0.0
229224

230-
return inside, error
225+
dist = self._polygon_xy.distance(xy_pos)
226+
return dist < eps, dist
231227

232228
def get_polygon_xy(self):
233229
"""Get the xy bounding polygon of the room."""
@@ -402,7 +398,8 @@ def repartition_rooms(
402398
min_iou_threshold=0.0,
403399
colors=None,
404400
verbose=False,
405-
eps=0,
401+
eps=0.0,
402+
z_eps=None,
406403
):
407404
"""
408405
Create a copy of the DSG with ground-truth room nodes.
@@ -449,36 +446,22 @@ def repartition_rooms(
449446
missing_nodes = []
450447
for place in G.get_layer(DsgLayers.PLACES).nodes:
451448
pos = G.get_position(place.id.value)
452-
if eps > 0:
453-
best_room = None
454-
best_error = float("inf")
455-
456-
for room in new_rooms:
457-
inside, error = room.pos_inside_room(pos, eps=eps)
458-
if inside:
459-
best_room = room
460-
best_error = 0.0
461-
break # stop at first valid assignment
462-
if error < best_error:
463-
best_error = error
464-
best_room = room
465-
466-
if best_room is not None:
467-
room_id = best_room.get_id()
468-
G.insert_edge(place.id.value, room_id.value)
469-
else:
470-
missing_nodes.append(place)
449+
best_room = None
450+
best_error = float("inf")
451+
452+
for room in new_rooms:
453+
inside, error = room.pos_inside_room(pos, eps=eps, z_eps=z_eps)
454+
if not inside:
455+
continue
456+
if error < best_error:
457+
best_error = error
458+
best_room = room
459+
460+
if best_room is not None:
461+
room_id = best_room.get_id()
462+
G.insert_edge(place.id.value, room_id.value)
471463
else:
472-
for room in new_rooms:
473-
inside, _ = room.pos_inside_room(pos, eps=eps)
474-
if not inside:
475-
continue
476-
477-
room_id = room.get_id()
478-
G.insert_edge(place.id.value, room_id.value)
479-
break # avoid labeling node as missing
480-
else:
481-
missing_nodes.append(place)
464+
missing_nodes.append(place)
482465
if verbose:
483466
print(f"Found {len(missing_nodes)} places node outside of room segmentations.")
484467

0 commit comments

Comments
 (0)