C++ 怎么判断点在圆内 C++ 坐标距离计算逻辑代码【几何】

不推荐用 sqrt 计算欧氏距离再比较,应比较平方距离与半径平方;函数需处理边界(如是否含圆上)、负半径等,推荐用 double 类型。

sqrt 计算距离再比较?不推荐

直接算欧氏距离再和半径比较,看似直观,但涉及 sqrt 开方运算,性能低且引入浮点误差。尤其在高频判断(如碰撞检测、点云筛选)中,能避免就避免。

  • 正确做法是**比较平方距离与半径的平方**,完全避开开方
  • sqrtcmath 中,但这里根本不需要调用它
  • 注意:所有坐标和半径必须是同类型(推荐 double,避免 float 精度不足)

point_in_circle 函数怎么写才安全

核心逻辑只三行:算 Δx² + Δy²,再和 r² 比较。但边界情况必须明确——“点在圆上”算不算“在圆内”?这取决于业务需求,函数接口要显式体现。

  • 若包含边界:用 distance_sq
  • 若严格内部:用 distance_sq
  • 务必检查 radius >= 0,负半径无几何意义,可断言或提前返回 false
  • 示例:
    bool point_in_circle(double px, double py, double cx, double cy, double r) {
        if (r < 0) return false;
        double dx = px - cx, dy = py - cy;
        return dx * dx + dy * dy <= r * r;
    }

整数坐标下要不要转 double

如果点和圆心坐标都是 int,而半径是 intlong long,直接用整数运算更安全——没有浮点舍入风险,且更快。

  • 只要 dx * dx + dy * dy 不溢出,就优先用整数计算
  • 例如:坐标范围在 ±10⁴ 内,dx² 最大 10⁸,int 可能溢出(INT_MAX ≈ 2×10⁹),建议用 long long 存放平方和
  • 对应签名可为:bool point_in_circle(int px, int py, int cx, int cy, int r),内部用 long long 算平方和

三维点判断球内?逻辑一样,只是多一项

从二维到三维,唯一变化是加一个 dz * dz。公式本质没变:点到球心的平方距离 ≤ 半径平方。

  • 别重复造轮子,把二维函数稍作扩展即可
  • 三维版只需增加 double dz = pz - cz,然后判断 dx*dx + dy*dy + dz*dz
  • 注意:三维场景下更需警惕数值范围——double 虽精度高,但极大坐标值相减后平方仍可能损失有效位

实际用的时候,最易忽略的是半径非负校验和整数溢出,尤其

是批量处理图像像素坐标或地图经纬度投影点时,这两处一错,结果就全偏了。