1015 - 計算幾何之多邊形的面積 - Build Your Home(POJ 3907)
阿新 • • 發佈:2018-11-10
題意
順時針或逆時針給出多邊形的頂點,求該多邊形的面積
分析
很基礎……
利用叉積的性質,每次選擇相鄰的兩個點做叉積,把答案累加起來
由於方向的問題,最後要取一個絕對值
又因為叉積算的是平行四邊形的面積,所以還要除以2
還有感謝zxy大佬Orz,我的神仙級錯誤又被他完美的debug掉。我居然把_y打成了-y????心態爆炸
程式碼
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> using namespace std; struct point { double x,y; point(){} point(double _x,double _y):x(_x),y(_y){ };//sbsbsbsbsbsbsbsbsb居然把_y打成了-y friend inline point operator +(const point &a,const point &b){ return point(a.x+b.x,a.y+b.y); } friend inline point operator -(const point &a,const point &b){ return point(a.x-b.x,a.y-b.y); } friend inline point operator *(double k,const point &a){ return point(a.x*k,a.y*k); } friend inline double dot(const point &a,const point &b){ return a.x*b.x+a.y*b.y; } friend inline double cross(const point &a,const point &b){ return a.x*b.y-b.x*a.y; } friend inline double len(const point &a){ return sqrt(dot(a,a)); } friend inline double dis(const point &a,const point &b){ return len(a-b); } }a[10009],S; int n; int main(){ while(1){ S.x=0.0;S.y=0.0; scanf("%d",&n); if(n==0) break; int i,j,k; for(i=1;i<=n;++i)scanf("%lf%lf",&a[i].x,&a[i].y); if(n==1||n==2){printf("0\n");continue;}//記著先把資料讀完!再判斷 double res=0; for(i=1;i<=n;++i){ int j=i+1;if(j>n) j=1; res+=cross(a[i]-S,a[j]-S); } printf("%.0f\n",fabs(res/2.0)); } return 0; }