不推荐用 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不溢出,就优先用整数计算 - 例如:坐标范围在 ±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。公式本质没变:点到球心的平方距离 ≤ 半径平方。
立即学习“C++免费学习笔记(深入)”;
- 别重复造轮子,把二维函数稍作扩展即可
- 三维版只需增加
double dz = pz - cz,然后判断dx*dx + dy*dy + dz*dz - 注意:三维场景下更需警惕数值范围——
double虽精度高,但极大坐标值相减后平方仍可能损失有效位
实际用的时候,最易忽略的是半径非负校验和整数溢出,尤其是批量处理图像像素坐标或地图经纬度投影点时,这两处一错,结果就全偏了。








