@@ -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