写了两个广度优先搜索的遍历循环,得到的结果为什么不一样呢?以下是我实现的两个函数,找GPT4O也没解决掉这个问题,求解答,十分感谢!
函数一:
def detect_and_select_faces(wall_faces):
"""
根据相邻性对面进行分组。
Args:
- wall_faces (list): 包含墙面对象的列表。
Returns:
- face_groups (list): 分组后的墙面列表。
"""
face_groups = [] # 存储分组后的墙面
for face0 in wall_faces:
face_group = [] # 存储当前墙面相邻的墙面
hasInGroup = False # 判断当前墙面是否已经在某个组中
# 遍历已分组的墙面组
for idf, item in enumerate(face_groups):
if face0 in item:
hasInGroup = True
# 如果当前墙面已经在组中,就检查该墙面周围的墙面是否也在同一组中
for i, face in enumerate(wall_faces):
# 如果墙面在组中,就不需要再次求关系了
if face in item:
pass
# 如果墙面不在组中,就检查两个墙面是否垂直且相邻,是的话就添加到组中
else:
if are_planes_perpendicular(face.plane_normal, face0.plane_normal) and \
are_boxes_adjacent(face.box.get_box_points(), face0.box.get_box_points(), threshold_distance=300):
face_groups[idf].append(face)
# 如果当前墙面已经在某个组中,则继续下一个墙面的分组
if hasInGroup:
continue
else:
# 如果当前墙面不在任何组中,就寻找与其相邻的其他墙面,将它们加入到同一组中
for i, face in enumerate(wall_faces):
if face.id != face0.id: # 防止与自身比较
if are_planes_perpendicular(face.plane_normal, face0.plane_normal) and \
are_boxes_adjacent(face.box.get_box_points(), face0.box.get_box_points(), threshold_distance=300):
face_group.append(face)
# 如果找到相邻的墙面,则将当前墙面加入到该组中
if len(face_group) >= 1:
face_group.append(face0)
face_groups.append(sorted(face_group, key=lambda x: x.id))
# 去除重复的墙面组
for idx, face_group in enumerate(face_groups):
face_groups[idx] = sorted(face_group, key=lambda x: x.id)
face_groups = sorted(face_groups, key=lambda x: x[0].id)
# 移除重复的组
n = 0
idxx = []
for idx, face_group in enumerate(face_groups):
if idx + 1 < len(face_groups):
if face_group[0].id == face_groups[idx + 1][0].id:
idxx.append(idx)
n = 0
for x in idxx:
x -= n
face_groups.remove(face_groups[x])
n += 1
# 打印每个组中的墙面id
for idx, face_group in enumerate(face_groups):
string = []
for face in face_group:
string.append(face.id)
print(string)
return face_groups
函数二:
```python
def detect_and_select_faces(wall_faces):
"""
根据相邻性和垂直性对面进行分组。
Args:
- wall_faces (list): 包含墙面对象的列表。
Returns:
- face_groups (list): 分组后的墙面列表。
"""
face_groups = [] # 存储分组后的墙面
visited_faces = set() # 记录已处理的面
def find_adjacent_perpendicular_faces(face0):
"""找到与给定面相邻且垂直的所有面。"""
adjacent_faces = []
for face in wall_faces:
if face.id != face0.id and face.id not in visited_faces:
if are_planes_perpendicular(face.plane_normal, face0.plane_normal) and \
are_boxes_adjacent(face.box.get_box_points(), face0.box.get_box_points(), threshold_distance=300):
adjacent_faces.append(face)
return adjacent_faces
for face0 in wall_faces:
if face0.id in visited_faces:
continue
face_group = [face0] # 用于存储相邻墙面的列表
visited_faces.add(face0.id) # 标记此面已处理
# 使用队列来处理相邻的面
queue = [face0]
while queue:
current_face = queue.pop(0)
adjacent_faces = find_adjacent_perpendicular_faces(current_face)
for adj_face in adjacent_faces:
if adj_face.id not in visited_faces:
face_group.append(adj_face)
visited_faces.add(adj_face.id)
queue.append(adj_face)
face_groups.append(sorted(face_group, key=lambda x: x.id))
face_groups = [group for group in face_groups if len(group) > 1]
return face_groups