C++如何判断一个点是否在凸多边形内(叉乘判定法)

轻丽吖_1180

轻丽吖_1180

2026-06-11

316人浏览

原创

叉乘判定法的核心逻辑是:点在凸多边形内当且仅当它始终位于所有有向边的同一侧,即对每条边 $p_i \to p_{i+1}$,向量叉积 $\text{cross}(p_i, p_{i+1}, q)$ 符号一致(全≥0 或全≤0),要求顶点严格按顺时针或逆时针顺序排列。

c++如何判断一个点是否在凸多边形内(叉乘判定法)

叉乘判定法的核心逻辑是什么

判断点是否在凸多边形内,本质是检查该点是否始终位于所有边的同一侧(比如左侧)。对凸多边形而言,只要点对每条有向边 p[i]→p[i+1] 的叉积符号一致(全 ≥ 0 或全 ≤ 0),就说明它在内部或边界上。

叉积公式(2D):(p2.x - p1.x) <em> (p3.y - p1.y) - (p2.y - p1.y) </em> (p3.x - p1.x),其中 p1,p2 是边端点,p3 是待测点。结果 > 0 表示 p3 在边的左侧,

注意:顶点顺序必须统一(顺时针或逆时针),否则叉积符号会混杂,判定失效。

如何写一个安全的 pointInConvexPolygon 函数

函数需处理边界情况(点在边上、顶点重合)、整数/浮点精度、顶点数量少于 3 等问题:

C++14
C++14

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

下载
  • 输入多边形顶点数组 pts 必须按顺序(如逆时针)存储,且首尾不重复(即 n 个点对应 n 条边)
  • 对每条边 pts[i] → pts[(i+1)%n],计算叉积 cross(pts[i], pts[(i+1)%n], q)
  • 使用统一符号判断:若所有叉积 ≥ 0(逆时针多边形),或全部 ≤ 0(顺时针),则点在内部或边上
  • 若某次叉积为 0,说明点在该边上;仍算“在内”,除非业务要求严格区分内部/边界
  • 避免用 == 0 判断浮点叉积,应加 epsilon 容差(如 abs(cross_val) )
bool pointInConvexPolygon(const vector<point>& pts, const Point& q) {
    int n = pts.size();
    if (n  1e-9) has_pos = true;
        else if (cr <h3>为什么不能直接套用到凹多边形</h3><p>叉乘判定法依赖凸性带来的“单侧一致性”——凹多边形存在内角 > 180° 的顶点,导致点可能对某些边在左侧、对另一些边在右侧,即使它实际在内部。</p><p>例如一个“凹四边形”中,中心点可能对一条边叉积为正,对对面边叉积为负,算法误判为外部。</p><p>这不是实现缺陷,而是数学前提不满足。凹多边形需改用射线法(<code>ray casting</code>)或三角剖分等更通用方法。</p><h3>容易被忽略的边界与性能细节<ul>
<li>顶点顺序错误是最常见 bug:用 OpenCV 的 <code>convexHull</code> 输出默认是顺时针,而多数叉积教程假设逆时针,符号逻辑要反过来</li>
<li>整数坐标下,叉积是整数,可避免浮点误差,但要注意溢出(如 <code>int</code> 坐标超 1e5 时,叉积可能超 <code>int</code> 范围,应转 <code>long long</code>)</li>
<li>若需高频调用(如碰撞检测),可预计算多边形方向(通过前两条边叉积定序),避免每次循环里重复判断</li>
<li>不要省略 <code>% n</code> 取模——漏掉会导致最后一条边(<code>pts[n-1]→pts[0]</code>)没参与判定</li>
</ul>
</h3><p>真正卡住人的往往不是算法本身,而是顶点顺序没校验、浮点比较没容差、或者把凸包生成结果默认当逆时针用了。</p></point>

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

2228

9

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

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

2024.03.14

999

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

1389

9

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

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

2024.03.22

1197

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人学习