不推荐用 sqrt 计算欧氏距离再比较,应比较平方距离与半径平方;函数需处理边界(如是否含圆上)、负半径等,推荐用 double 类型。
sqrt 计算距离再比较?不推荐直接算欧氏距离再和半径比较,看似直观,但涉及 sqrt 开方运算,性能低且引入浮点误差。尤其在高频判断(如碰撞检测、点云筛选)中,能避免就避免。
sqrt 在 cmath 中,但这里根本不需要调用它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,而半径是 int 或 long long,直接用整数运算更安全——没有浮点舍入风险,且更快。
dx * dx + dy * dy 不溢出,就优先用整数计算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 虽精度高,但极大坐标值相减后平方仍可能损失有效位实际用的时候,最易忽略的是半径非负校验和整数溢出,尤其是批量处理图像像素坐标或地图经纬度投影点时,这两处一错,结果就全偏了。