天天看点

求多边形质心(代码)

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