跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

c++如何判断点是否在矩形内_c++几何算法基础【练习】

轴对齐矩形内点判断用坐标比较:p.x∈[x_min,x_max]且p.y∈[y_min,y_max];旋转矩形则用std::abs((p−center)·u)≤half_w和std::abs((p−center)·v)≤half_h,需单位向量与浮点容差。 用
std::abs
和坐标比较判断点是否在轴对齐矩形内 轴对齐矩形(AABB)是最常见情况:四边平行于坐标轴。此时无需向量或叉积,只需比较横纵坐标范围。 假设矩形由左上角
(x_min, y_min)
和右下角
(x_max, y_max)
定义(注意:y 轴方向需与你的坐标系一致;若 y 向下为正,
y_min < y_max
成立;若 OpenGL 风格 y 向上为正,可能需交换逻辑)。 点
p
在矩形内(含边界)的充要条件是:
p.x >= x_min && p.x <= x_max
p.y >= y_min && p.y <= y_max
若需严格内部(不含边界),把
>=
和
<=
换成
>
和
<
即可。 立即学习 “ C++免费学习笔记(深入) ”; 处理旋转矩形:用点到边的有向距离判断 旋转矩形不能只比坐标,得转到局部坐标系,或用“点在每条边左侧(或右侧)”来判定。推荐用向量投影法:将点相对于矩形中心平移后,做两次点积,看是否落在半宽/半高范围内。 设矩形中心为
center
,两个正交单位向量
u
(沿长边)、
v
(沿短边),半宽
half_w
、半高
half_h
。则点
p
在矩形内等价于: C函数速查手册(CHM版) C函数速查手册(CHM版) 下载
std::abs((p - center).dot(u)) <= half_w
std::abs((p - center).dot(v)) <= half_h
注意:
u
和
v
必须是单位向量,否则点积结果会缩放失真。如果只有四个顶点,可用
v1v2
和
v2v3
叉出法向再归一化,但更稳妥的是用
std::normalize
(C++23)或手动除模长。 别直接用
float
做相等判断——浮点误差会让边界判定失效 当矩形边界由浮点计算得出(比如变换后顶点),直接写
p.x == x_min
几乎总为 false。所有边界比较都应带容差: 用
std::abs(p.x - x_min) <= eps
代替
p.x >= x_min
的临界判断 典型
eps
值:对
float
用
1e-5f
,对
double
用
1e-9
若矩形尺寸跨度大(如 1e6 量级),容差应随尺度缩放,例如
eps * std::max(std::abs(x_min), std::abs(x_max))
漏掉容差,会导致本该在边上的点被误判为外部,尤其在图形拾取或碰撞检测中会明 显卡 顿或漏响应。 性能敏感场景下避免函数调用开销 如果每帧要判断数万次(如粒子系统),优先展开计算、避免临时对象和 STL 函数调用: 手写
dot
而非依赖
std::inner_product
或自定义 vector 类的成员函数 用
(p.x - cx) * ux + (p.y - cy) * uy
替代
(p - center).dot(u)
(前提是
ux, uy
已预存) 若矩形不旋转,分支预测友好,现代 CPU 几乎无延迟;但旋转矩形的两次点积+两次
std::abs
仍比纯比较慢约 3–5 倍 真正容易被忽略的是:很多项目先做粗略 AABB 包围盒剔除,再对候选者做旋转矩形精判——这个两级结构比单层判断快一个数量级,但需要你主动组织数据,不是库函数能自动提供的。

相关文章