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

Python提取圆内所有整数坐标点:现有函数优化问询

解决圆内所有整数坐标点提取的问题

首先得说,你原来的函数有两个关键问题:一是x和y都用了math.cos(i),这会生成一条直线上的点(因为x和y值完全相同),正确的圆周点应该是一个用cos、一个用sin;二是这个函数只生成了圆周上的离散点,完全没覆盖圆内部的点,这肯定满足不了你的需求。

要提取圆内所有整数坐标点,核心思路是遍历所有可能的整数x,然后计算对应的y的合法范围,把所有满足圆方程的(x,y)整数对收集起来。具体实现可以这样:

import math

def get_all_integer_points_in_circle(circles):
    xc, yc, r = circles
    # 先确定x的有效范围:x不能超出圆心±半径,否则肯定不在圆内
    x_min = int(math.floor(xc - r))
    x_max = int(math.ceil(xc + r))
    points = []
    
    for x in range(x_min, x_max + 1):
        # 计算当前x对应的y的最大允许平方值:r² - (x - xc)²
        dx = x - xc
        squared_y_max = r**2 - dx**2
        if squared_y_max < 0:
            continue  # 这个x对应的y不存在,直接跳过
        
        # 计算y的上下范围
        y_half_range = math.sqrt(squared_y_max)
        y_min = int(math.floor(yc - y_half_range))
        y_max = int(math.ceil(yc + y_half_range))
        
        # 遍历所有符合条件的y,加入结果列表
        for y in range(y_min, y_max + 1):
            # 二次校验(避免浮点计算误差导致的边界点错误)
            if (x - xc)**2 + (y - yc)**2 <= r**2:
                points.append([x, y])
    
    return points

代码细节解释:

  • 先通过xc ± r确定x的范围,减少不必要的遍历;
  • 对每个x,计算(x-xc)²,用半径平方减去这个值得到y方向的最大允许平方值,如果这个值小于0,说明当前x不在圆的水平范围内,直接跳过;
  • 用floor和ceil处理y的上下限,确保覆盖所有可能的整数y;
  • 最后加了一次二次校验,避免因为浮点平方根计算的精度问题,把刚好在圆外的点误加进来。

额外优化(纯整数运算版):

如果你的圆心坐标xc、yc本身就是整数,还可以用纯整数运算彻底避免浮点误差,同时提升运行效率:

import math

def get_all_integer_points_in_circle_integer(circles):
    xc, yc, r = circles
    # 先将圆心坐标转为整数(如果输入是浮点数,可根据需求调整转换逻辑)
    xc = int(xc)
    yc = int(yc)
    r_squared = r**2
    x_min = xc - r
    x_max = xc + r
    points = []
    
    for x in range(x_min, x_max + 1):
        dx = x - xc
        dx_squared = dx**2
        remaining = r_squared - dx_squared
        if remaining < 0:
            continue
        
        # 用整数平方根函数获取y的最大绝对值(Python 3.8+支持)
        y_max_abs = math.isqrt(remaining)
        y_min = yc - y_max_abs
        y_max = yc + y_max_abs
        
        for y in range(y_min, y_max + 1):
            points.append([x, y])
    
    return points

这个版本用math.isqrt直接返回不超过平方根的最大整数,全程用整数运算,既避免了浮点误差,又比浮点计算更快。

内容的提问来源于stack exchange,提问作者aze45sq6d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:49:22