You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:33:15