HDU-2036(多边形面积)

题目大意:

给你一个多边形,求它的面积。

多边形面积可以用向量知识来求解。

对于一个凸多边形,如下:

其面积可以表示为 S = S△OAB+S△OBC+S△OCD+S△ODE

对于△OAB 其面积用向量表示为 0.5 * |OA| * |OB| * sin∠AOB=0.5 * | OA x OB|

其中OA x OB表示叉乘(非点乘,具体详见百度百科“向量积”)

但因为向量叉乘有正有负,所以我们取的是绝对值,保证题目答案的正负。(正负取决于两条边的位置状态)

这时候就可以简单的计算出多边形的面积。

对于一个 凹多边形,如下:

其面积依然就可以用向量的方法求解

假设点O为坐标原点,则 S = S△OAB+S△OBC+S△OCD+S△ODE+S△OEA

S△OAB = 0.5 * OA x OB =0.5 * ( A.x * B.y - A.y * B.x )

其中S均表示在叉乘意义下的值,由于其具有正负之分,所以可以用来计算凹多边形的面积(具体证明过程略)。

这时候就可以计算出多边形的面积。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# include<bits/stdc++.h>

using namespace std;

# define ll long long

int main()
{
int n,i;
double a[1000];
double b[1000];
while(~scanf("%d",&n) && n){
for(i=1;i<=n;i++){
scanf("%lf %lf",&a[i],&b[i]);
}
a[0]=a[n];
b[0]=b[n];
double res=0;
for(i=0;i<n;i++){
res=res+(a[i]*b[i+1]-b[i]*a[i+1])/2;//由于是逆时针方向,所以求出来结果为正。
}
printf("%.1lf\n",res);
}
return 0;
}
感谢您的支持
-------------本文结束感谢您的阅读-------------