題意
題意很明確: 題目給出了一個多邊形的座標,求出其面積在做取整即可。
思路
求任意多邊形的面積, 有很多種方法,包括圖形學上的掃描算法等,還有分解等等。這裏在網上查過資料後, 用向量的方法解決很方便,如下:
任意多邊形的面積可由任意一點與多邊形上依次兩點連線構成的三角形矢量面積求和得出。
如下圖:
另外不用考慮向量的點乘結果的正負,直接帶符號運算即可。
比如取原點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);
}
}