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)*对应的子三角面积/总面积 )