多边形面积在计算机中有一个很好的处理办法就是相量叉乘,我们知道三角形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 }
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 }