Python如何遍历嵌套列表并实现圆重叠检测与去重
Python如何遍历嵌套列表并实现圆重叠检测与去重
嘿,我来帮你搞定这个圆重叠检测和去重的问题!先看你现有的代码,首先得把每个圆的「完整信息」(坐标+半径)存到一起,不然后续检测的时候找不到对应半径就白搭啦。我给你一步步拆解解决方案:
第一步:修正数据存储结构
你现在的列表只存了坐标,得把半径也绑定进去。比如每个圆用一个列表(或元组)存[x, y, 半径],这样遍历的时候能直接拿到所有需要的参数。
第二步:重叠检测的核心逻辑
两个圆重叠的判断条件很简单:圆心之间的距离 ≤ 两个半径之和。如果所有圆半径都是1,那就是距离≤2就行。计算圆心距离用欧几里得公式:
distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
第三步:两种实现方式
方式一:生成时直接检测(效率更高)
生成新圆的时候就和已有的圆对比,不重叠才加入列表,避免后续再批量处理:
import random import math # 生成包含坐标和半径的圆信息 def create_circle(x, y, rad): return [x, y, rad] circles = [] target_count = 3 # 你想要的最终圆数量 radius = 1 coord_range = (0, 10) # 坐标生成范围,可自定义 while len(circles) < target_count: # 生成随机坐标 x = random.uniform(*coord_range) y = random.uniform(*coord_range) new_circle = create_circle(x, y, radius) # 检测是否与已有圆重叠 is_overlap = False for existing_circle in circles: dx = new_circle[0] - existing_circle[0] dy = new_circle[1] - existing_circle[1] distance = math.sqrt(dx**2 + dy**2) # 满足重叠条件就标记,跳出循环 if distance <= new_circle[2] + existing_circle[2]: is_overlap = True break # 不重叠才加入列表 if not is_overlap: circles.append(new_circle) # 打印结果 print("去重后的圆列表:") for idx, circ in enumerate(circles, 1): print(f"圆{idx}:圆心({circ[0]:.2f}, {circ[1]:.2f}),半径{circ[2]}")
方式二:事后批量去重(针对已生成的圆列表)
如果你已经有了一堆圆的列表,现在要批量去掉重叠的,可以这么做:
import math # 假设你已经有了一个包含所有圆的circles列表 circles = [[1, 2, 1], [3, 4, 1], [1.5, 2.5, 1]] # 示例数据 unique_circles = [] for current_circle in circles: overlap_found = False # 和已保留的不重叠圆逐一对比 for existing in unique_circles: dx = current_circle[0] - existing[0] dy = current_circle[1] - existing[1] distance = math.sqrt(dx**2 + dy**2) if distance <= current_circle[2] + existing[2]: overlap_found = True break # 不重叠就加入结果列表 if not overlap_found: unique_circles.append(current_circle) print("批量去重后的圆列表:") for circ in unique_circles: print(f"圆心({circ[0]:.2f}, {circ[1]:.2f}),半径{circ[2]}")
小提醒
- 别用
list当变量名!它是Python的内置类型,会覆盖掉原生功能,换成circles这类有意义的名字更稳妥。 - 如果要生成大量圆(比如上百个),双重循环效率会下降,可以试试网格划分的方法减少对比次数,但少量圆的话当前方法完全够用。
内容来源于stack exchange
相关产品推荐
相关产品推荐

