C++如何判断一个矩形是否包含一个点

夏涛酱_8024

夏涛酱_8024

2026-05-31

762人浏览

原创

判断矩形是否包含点的本质是检查点的横纵坐标是否同时落在矩形左右、上下边界内;推荐用结构体而非嵌套pair提升可读性,sfml中直接使用sf::floatrect::contains(),注意其参数为(left,top,width,height)且仅支持轴对齐矩形。

c++如何判断一个矩形是否包含一个点

用 std::pair 或结构体表示点时,判断逻辑最直接

矩形是否包含点,本质是判断点的横纵坐标是否同时落在矩形的左右边界和上下边界内。C++ 没有内置的“矩形包含点”函数,得自己写条件表达式。常见做法是把矩形定义为左上角 (x1, y1) 和右下角 (x2, y2)(注意:y 轴向下增长时,y1 ;若 y 向上增长如 OpenGL,则需调整不等号方向)。

假设点为 std::pair<double double> p</double>,矩形为 std::pair<:pair double>, std::pair<double double>> rect</double></:pair>(左上、右下),则判断逻辑为:

bool contains = 
  p.first >= rect.first.first && 
  p.first = rect.first.second &&
  p.second <p>更推荐封装成结构体,避免嵌套 <code>pair</code> 导致可读性差:</p><pre class="brush:php;toolbar:false;">struct Point { double x, y; };
struct Rect { double left, top, right, bottom; };
bool contains(const Rect& r, const Point& p) {
  return p.x >= r.left && p.x = r.top  && p.y <h3>使用 <code>sf::FloatRect</code> 时直接调用 <code>contains()</code> 方法</h3><p>如果你在用 SFML,别重复造轮子。<code>sf::FloatRect</code> 已经提供了健壮的 <code>contains()</code> 成员函数,它内部处理了浮点精度、边界包含策略(默认闭区间)和坐标系方向。</p><p>注意几个易错点:</p>
  • sf::FloatRect 构造参数是 (left, top, width, height),不是两个角点 —— 宽高为负会导致未定义行为
  • 点坐标类型必须是 sf::Vector2f,传 int 会隐式转换但可能掩盖精度问题
  • 若矩形被旋转过,contains() 不适用 —— 它只支持轴对齐矩形

示例:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
sf::FloatRect rect(10.f, 20.f, 100.f, 80.f);
sf::Vector2f point(50.f, 60.f);
if (rect.contains(point)) { /* ... */ }

边界条件处理:开区间、闭区间、浮点误差怎么选

“包含”在数学和图形学中含义不同:contains() 是否包含边框?是否允许点恰好等于边界值?这直接影响碰撞检测、UI 点击判定等场景。

常见选择:

  • UI 响应(如按钮点击):通常用闭区间(>= / ),让边缘像素也能触发
  • 物理引擎或剔除逻辑:有时用半开区间(如 >= left && = top && ),避免相邻矩形边界重复命中
  • 浮点数比较:避免直接用 == 判断边界,但 >= 和 在 IEEE 754 下对有限值是安全的;若涉及计算后坐标(如变换矩阵乘法结果),建议加小 epsilon 容差(如 <code>abs(p.x - r.left) )再归入边界

自定义类中重载 operator() 或提供 isInside() 接口更清晰

当矩形是某个业务类的成员(比如 Widget 或 Sprite),硬写四段比较条件会污染调用方代码。更好的方式是在类内提供语义明确的接口。

例如:

class BoundingBox {
public:
  double x, y, w, h;
  bool isInside(double px, double py) const {
    return px >= x && px = y && py <p>这样调用时干净利落:<code>if (bbox.isInside(mouseX, mouseY))</code>。注意:不要在接口名里用 <code>contains</code>,除非你严格遵循 STL 风格(如容器的 <code>contains</code> 是 C++20 新增且语义固定),否则容易和库函数混淆。</p><p>边界方向、浮点策略、坐标系约定这些细节一旦定下来,就该在类注释里写清楚 —— 后续维护的人不会去翻你十年前写的 if 条件。</p>

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

427

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习