void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

多边形面积在计算机中有一个很好的处理办法就是相量叉乘,我们知道三角形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 }
posted on 2011-04-17 10:51  void-man  阅读(6907)  评论(0编辑  收藏  举报