两个简单多边形全等需存在刚性变换使其顶点一一对应、边长与内角均相等(允许镜像);须通过归一化边长与内角序列的字典序最小表示或带反射的Procrustes分析+顶点顺序穷举来判定,无高效通用解。

两个简单多边形全等,不等于“看起来一样”或“边长集合相同”,而是要求存在刚性变换(平移、旋转、反射)使它们完全重合——这意味着必须能建立顶点间的一一对应,使得所有对应边长度相等、所有对应角大小相等,且绕向可相反(允许镜像)。
先确认边数与顶点顺序无关的边长/角度集合是否匹配
这是最易踩坑的第一步:不能直接比 vector<point></point> 是否相等,也不能只排序边长后逐个比较。因为:
- 正五边形和某个非正但边长碰巧相同的五边形,边长集合一样,但角不同 → 不全等
- 两个全等但起始顶点不同的多边形(如 A: [p0,p1,p2,p3] vs B: [p2,p3,p0,p1]),排序边长后一致,但无法保证角度序列对齐
- 反射(镜像)会使角度符号翻转,但余弦值相同;所以必须用无符号角(如内角大小)或用边-角-边三元组规避方向依赖
实操建议:
- 对每个多边形,计算其**归一化边长序列**:
dist(p[i], p[(i+1)%n]),再做 n 次循环移位,取字典序最小的那版作为 canonical 边长串 - 同时计算**内角序列**(用向量夹角,
acos(dot(u,v)/(norm(u)*norm(v)))),同样做 n 次移位取字典序最小;注意用EPS = 1e-9处理浮点误差,避免acos输入越界 - 若两多边形 n 不等,直接返回 false
- 若边长 canonical 序列和内角 canonical 序列都逐项近似相等(用
abs(a-b) ),才进入下一步验证
暴力尝试所有可能的顶点映射 + 刚性变换拟合
边长和角度序列一致只是必要条件,不是充分条件。例如某些星形多边形可能有相同边长/角度多重排列,但几何构型不可重合。必须验证是否存在一个刚性变换,把一个多边形的某一轮转+镜像版本,精确映射到另一个上。
立即学习“C++免费学习笔记(深入)”;
实操建议(n ≤ 8 时可行;n 更大需降维或采样):
- 枚举参考多边形 A 的每个顶点
i作为起点,再枚举方向:正向(i, i+1, i+2...)或反向(i, i-1, i-2...),共2*n种顶点顺序候选 - 对每种候选,取前三个不共线点(
a,b,c)构造局部坐标系:原点 =a,x 轴 = 单位向量b-a,y 轴 = 逆时针旋转 90° 后单位化 - 将该候选序列所有点转换到此坐标系下,得到归一化坐标
q[0..n-1] - 对目标多边形 B 做同样处理(取其所有
2*n种顺序,也用前三点建系),得到r[0..n-1] - 若存在某组
(A-candidate, B-candidate),使得对所有j都满足abs(q[j].x - r[j].x) ,则全等
关键细节:建系时若前三点共线(cross(b-a, c-a) == 0),跳过该候选;用叉积平方避免开方,全程用 double 和 EPS=1e-9。
用 Procrustes 分析快速初筛(适合 n ≥ 5)
当顶点数较多(比如 n > 6),暴力枚举 2*n*2*n 种组合太慢。可用带反射的普通 Procrustes 分析(Orthogonal Procrustes with reflection)来拟合最优刚性变换,再检验残差。
实操建议:
- 对多边形 A 和 B,先中心化:减去各自质心
centroid = accumulate / n - 构造协方差矩阵
H = A_centered^T * B_centered(A_centered是 n×2 矩阵) - SVD 分解
H = U * S * V^T,则最优旋转矩阵为R = V * diag(1, det(V*U^T)) * U^T(diag(1, ±1)控制是否加反射) - 计算变换后点:
A_transformed = A_centered * R + B_centroid,再比对max_i norm(A_transformed[i] - B[i]) - 但注意:Procrustes 默认顶点已按对应顺序排列。所以必须在外层套一层循环,尝试 B 的所有
2*n种顶点顺序(即重排 B 的行),对每种重排运行一次 Procrustes
这个方法数值稳定,且天然支持反射,但无法绕过顶点顺序未知的问题——它只是把“穷举映射”换成了“穷举顺序 + 一次最优拟合”。
真正难的不是算变换,而是确认哪两个顶点该对齐。即使边长、角度、面积、周长、外接圆半径全都一样,若顶点连接关系不同(比如凹陷位置错位),仍不全等。所有自动算法都必须面对组合爆炸,没有银弹;生产环境建议限制 n ≤ 10,或提前用凸包/对称性剪枝。


















