向量叉乘求任意多边形面积,凹凸均可

多边形面积在计算机中有一个很好的处理办法就是相量叉乘,我们知道三角形ABC的面积可以等于1/2*|AB|*|AC|*sinABC,也就是等于ABXAC的模

若A(x1,y1),B(x2,y2),那么S=x1*y2-x2*y1,由此就可以求的

c0de7a1806d89238dbb4bdf0.jpg

其中点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 }

转载于:https://www.cnblogs.com/void/archive/2011/04/17/2018729.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值