题意
题意很明确: 题目给出了一个多边形的座标,求出其面积在做取整即可。
思路
求任意多边形的面积, 有很多种方法,包括图形学上的扫描算法等,还有分解等等。这里在网上查过资料后, 用向量的方法解决很方便,如下:
任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出。
如下图:
另外不用考虑向量的点乘结果的正负,直接带符号运算即可。
比如取原点O为起始点,
Pi 是顶点,座标是(xk,yk) ,则该多边形面积为:
S=abs(∑nk=1SOPkPk+1)=abs(12∗∑nk=1xk∗yk+1−yk∗xk+1)
注:这里的最后需要取绝对值,因为对于向量来说,正方向的取法不同,结果正负就不同,因此取绝对值。
代码
#include <iostream>
using namespace std;
int k;
double sum,*x,*y;
int main()
{
while(cin>>k&&k)
{
x=new double[k];
y=new double[k];
sum=0.0;
for(int i=0; i<k; i++)
cin>>x[i]>>y[i];
if(k==1||k==2)
{
cout<<0<<endl;
continue;
}
for(int i=1;i<k; i++)//取mod是为了考虑最后一个连接第一个.这里取得起始点是第一个点,取原点也可以
sum+=((x[i%k]-x[0])*(y[(i+1)%k]-y[0])-(x[(i+1)%k]-x[0])*(y[i%k]-y[0]));
if(sum<0) sum*=-1;
cout<<int(0.5*sum+0.5)<<endl;
delete(x);
delete(y);
}
}