说明
严格来说,重心是个物理概念,含义是力矩的平衡点,也就是说沿重心把物体挂起来,左右两侧重量并不一定相等,但是力矩是相等的,所以保持了平衡。
所谓三角形重心、多边形重心,其实是把几何图形当做均匀的薄片来处理,找到其形心,也就是重心。
几何
三角形中,重心坐标其实就是三个顶点坐标的平均值。与重心相关的,还有重心坐标,在重心坐标系统中,可以将三角形所在平面上的点,用三个顶点的加权值来表示,比如:重心在重心坐标系统中,就是(1/3, 1/3, 1/3)
。
还记得在定义三角形时,我们讲过,可以把三角形当成一个特殊的“局部坐标系”吗?
把三个点当成是矩阵的 x, y, z 轴,这样一个三角形实际就是一个不包含平移的矩阵,只有旋转、缩放、错切,不一定正交。
重心在重心坐标系统中,就是(1/3, 1/3, 1/3)
,其实就意味着重心在这个局部坐标系中的坐标是(1/3, 1/3, 1/3)
。那么它的真实坐标(也就是世界坐标)应该是这个坐标系的矩阵乘以点的坐标。
所以实际上,下面两种写法是等同的
// 将`(1/3, 1/3, 1/3)`从局部坐标空间,转换到世界坐标空间
triangle.points * simd_float3(arrayLiteral: 1/3.0)
// 直接在世界坐标空间,对顶点加权求和,得到重心坐标
(triangle.point1 + triangle.point2 + triangle.point3)/3
代码
///三角形的重心、几何中心
static func barycenter(triangle:Triangle) -> simd_float3 {
return (triangle.point1 + triangle.point2 + triangle.point3)/3
}
///三角形重心的重心坐标
static func barycenterInBarycentricCoordinate(triangle:Triangle) -> simd_float3 {
return simd_float3(arrayLiteral: 1/3.0)
}