全等判断需通过刚体变换归一化顶点序列后比对。先找字典序最小点作起点并循环移位,再用叉积判方向并统一朝向,最后检查镜像可能性;浮点坐标须用相对容差比较。

全等判断的核心是“刚体变换不变性”
两个多边形全等,意味着存在平移、旋转、反射(镜像)或它们的组合,能把其中一个完全重合到另一个上。C++ 里没有现成函数直接判全等,必须自己实现:先标准化顶点序列(消除起点和方向差异),再逐点比对。关键不是算面积或周长——那只能排除不等,不能确认全等。
顶点顺序和起始点必须归一化
同一个多边形可能以不同起点、顺时针或逆时针顺序存储顶点,比如 [(0,0),(1,0),(1,1)] 和 [(1,0),(1,1),(0,0)] 是同一三角形但序列不同。直接 == 比较会失败。
- 对每个多边形,先将顶点按字典序排序后取最小点作为起点(即找
min_element按(x,y)元组比较) - 再将顶点序列循环移位,使该最小点为首个元素
- 接着判定方向:用叉积和判断是顺时针还是逆时针;若方向相反,就翻转顶点顺序(或对其中一个做 reverse)
- 最后还要考虑镜像:把其中一个多边形所有点 x 坐标取反(或 y 取反),再重复上述归一化流程,看能否匹配
浮点坐标必须用容差比较,且需注意误差传播
如果顶点是 double 或 float 类型,不能直接用 ==。但简单用固定 EPS = 1e-9 也不够——旋转后的坐标误差会放大,尤其当多边形尺寸大或角度接近 90° 时。
- 建议用相对容差:
abs(a - b) - 归一化过程中涉及向量长度、叉积、角度计算时,优先用整数运算(如输入是格点坐标)或高精度中间类型(
long double) - 避免在归一化前做旋转:先对齐最小点再平移,比先旋转再对齐更稳定
凸多边形可优化,凹多边形必须逐排列举
对凸多边形,只需尝试最多 n 种起点偏移 + 2 种方向(正向/镜像),共 2n 次比对;但凹多边形存在“自遮挡”,相同顶点集可能对应不同拓扑,必须确保顶点顺序严格一致——也就是说,不能只靠点集相等,必须保持原始绕序语义。
- 若已知多边形简单(无自交)且顶点按边界顺序给出,可跳过凹性检测
- 否则需先调用
is_simple_polygon()(如用射线法或单调链)再进入全等判断,否则[(0,0),(2,0),(1,1),(2,2),(0,2)]和其镜像可能被误判为全等,实际不是 - OpenCV 的
cv::matchShapes()是近似匹配,基于矩特征,不保证严格全等,慎用于几何证明场景
真正可靠的全等判断,躲不开顶点序列的规范化与双方向(含镜像)穷举比对。最易漏掉的是镜像情形——很多人只试了旋转和平移,忘了翻转也属于刚体变换。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











