多边形面积在计算机中有一个很好的处理办法就是相量叉乘,我们知道三角形ABC的面积可以等于1/2*|AB|*|AC|*sinABC,也就是等于ABXAC的模
若A(x1,y1),B(x2,y2),那么S=x1*y2-x2*y1,由此就可以求的
其中点O的坐标可以任意 ,一般都取原点
例a : S = Soab + Sobc + Socd + Soda ,4个三角形都是顺时针,面积为他们和的绝对值。
例b : S =Soab+Sobc+Socd+Soda ,4个三角形中后3个是顺时针,后3个的绝对值的面积Sobcda,但是Soab为逆时针,符号与后三个相反,4个相加刚好把多余的抵消。
c,d同理
由于叉乘得到的结果有正负,即为方向,但是我们取面积,没有正负,需要取绝对值即可
1 --*
2 * 计算多边形面积(利用向量叉乘)
3 */
4
5 struct Point { // 点结构体
6 int x, y;
7 };
8
9 // 点的叉乘: AB * AC
10 int cross(const Point &A, const Point &B, const Point &C) {
11 return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);
12 }
13
14 --*
15 * 计算多边形面积
16 * 参数:n个顶点, 多边形顶点坐标集合
17 */
18 double polygon_area(const int &n, Point p[])
19 {
20 double area = 0.0;
21 int i;
22 Point temp;
23
24 temp.x = temp.y = 0;//原点
25 for (i = 0; i < n-1; ++i){
26 area += cross(temp, p[i], p[i+1]);
27 }
28 area += cross(temp, p[n-1], p[0]);//首尾相连
29 area = area/2.0; //注意要除以2
30 return area > 0 ? area : -area; //返回非负数
31 }