核心概述:将简单多边形分解为“原点+边”的三角形,用面积加权求和在 O(n) 时间内计算几何重心(质心)。

Description: Returns the center of mass for a polygon. Time: O(n)

展开阐述

  • 定义与背景
    • 定义:多边形重心(center of mass/centroid)是将多边形视为均匀密度刚体时的质心位置。
    • 假设与能力边界:默认简单多边形(无自交),顶点按顺序给出;顶点方向不影响结果坐标,但会影响中间的有向面积符号,需统一处理。
    • 典型场景:几何形状的代表点/平移对齐、物理仿真中的合力合矩简化、与旋转/碰撞的支点计算、与042-几何-多边形面积合用做形状分析。
  • 接口/数据结构(据实现)
    • 函数签名:P polygonCenter(const vector

      & v),P = Point

    • 语义:返回多边形 v 的质心坐标;内部以双精度累加,最后做一次整体归一。
    • 与面积复用:实现中会同时累计两倍有向面积 A(可与“鞋带公式”共用),便于统一符号与规模。
  • 核心流程/要点(面积加权的边遍历公式)
    1. 索引与闭合:遍历 i=0..n-1,令 j=(i+1)%n 表示后一顶点,按有向边 (v[i], v[j]) 累计。
    2. 局部量:设 c = cross(v[i], v[j])(两倍有向三角形面积,原点为第三点)。
    3. 坐标加权:res += (v[i] + v[j]) * c。直观理解为:边中点的坐标乘以该“三角片”的有向面积。
    4. 面积累计:A += c。
    5. 归一:返回 res / (3*A)。当 A<0(顺时针)时,分子分母同号,结果仍为正确的几何坐标。
  • 复杂度与边界条件
    • 时间复杂度:O(n)。
    • 退化:
      • n<3 或 area≈0:退化为线或点,重心未定义或等价于点集合的算术平均;工程上应在上游检测并分支。
      • 自交多边形:按代数面积加权得到的是“代数质心”,不再等价于几何并域的物理质心。
    • 数值与精度:
      • 浮点累加建议使用 double/long double;大坐标或大量顶点时误差累计可观。
      • 若输入为整数坐标而需要精确分数,可内部以有理数/高精度类型累计再转出。
  • 变体/扩展
    • 已知面积复用:若已计算出 area2(两倍有向面积),可直接将 A 设为 area2 并跳过再次求和。
    • 带洞多边形:对每个环独立累加;约定外环取正、内环取负(与面积符号一致),总和后再归一。
    • 多边形平移不变性:先平移再求心与先求心再平移结果一致,可用于数值稳定(把重心附近平移至原点)。
  • 正确性要点与直觉性证明
    • 三角形质心为三个顶点的平均(或“重心在中线 2:1 处”);多边形按“原点与相邻顶点”分解为若干三角形,其重心为这些三角形质心的面积加权平均,线性性保证合并正确。
    • 有向面积的符号一致性保证了 cw/ccw 的统一;最终 res/(3A) 消去符号影响,得到几何坐标。
  • 与相邻技术的对比与取舍
    • 042-几何-多边形面积:两者共用边叉积累计;先得 area2 再得重心可减少一次遍历或复用中间量。
    • 与点集算术平均:算术平均不考虑形状的填充几何,仅适用于“顶点质量均分”的模型;本方法给出均匀密度实体的物理质心。
    • 044-几何-多边形切割:切割后重心可通过对两个部分分别求心与面积,再做面积加权合并得到整体重心。

关联节点