求多边形质心(代码)
1 //叉乘算三角形面积(有正负),以及算三角形质心坐标 2 void TriangleCentroid(Vec2d P1, Vec2d P2, Vec2d P3, double& area,Vec2d& centroid) 3 { 4 Vec2d P12 = P2 - P1; 5 Vec2d P13 = P3 - P1; 6 7 double x1 = P12.x(); 8 double y1 = P12.y(); 9 10 double x2 = P13.x(); 11 double y2 = P13.y(); 12 13 14 //向量叉乘计算三角形面积 15 area = (x1*y2 - x2*y1)/2; 16 17 //计算三角形质心 18 centroid.x = (p1.x + p2.x + p3.x) / 3; 19 centroid.y = (p1.y + p2.y + p3.y) / 3; 20 21 return; 22 } 23 24 //计算质心坐标,多边形的顶点按顺序排列在数组中 25 bool PolygonCentroid(std::vector<Vec2d> Points, Vec2d& centroid) 26 { 27 int count = Points.size(); 28 29 //如果不是多边形,不计算 30 if (count < 3) 31 return false; 32 33 //多边形总面积 34 double totalArea = 0; 35 36 //n边形划分成n-2个三角形,每个三角形质心坐标与该三角形面积乘积之和 37 Vec2d totalTriangleCentroid(0,0); 38 39 //按顶点顺序,1,2,3;1,3,4;1,4,5;如此构建三角形 40 for (int i = 1; i < count - 1; i++) 41 { 42 double temp; 43 Vec2d tempCentroid; 44 45 //计算每个三角形的面积与质心坐标 46 TriangleCentroid(Points[0], Points[i], Points[i + 1], temp,tempCentroid); 47 48 totalTriangleCentroid.x += tempCentroid.x * temp; 49 totalTriangleCentroid.y += tempCentroid.y * temp; 50 51 totalArea += temp; 52 } 53 54 55 //计算质心坐标 56 centroid.x = totalTriangleCentroid.x / temp; 57 centroid.y = totalTriangleCentroid.y / temp; 58 59 return true;; 60 }
二维与三维,多维是一样的情况;
三角形的质心(A+B+C)/3,采用向量计算(三角形面积有正负);
多边形质心 = ( (对应三角形质心_X)*对应的子三角面积/总面积 , (对应三角形质心_Y)*对应的子三角面积/总面积 )