1. 程式人生 > >1015 - 計算幾何之多邊形的面積 - Build Your Home(POJ 3907)

1015 - 計算幾何之多邊形的面積 - Build Your Home(POJ 3907)

傳送門

 

題意

順時針或逆時針給出多邊形的頂點,求該多邊形的面積

 

分析

很基礎……

利用叉積的性質,每次選擇相鄰的兩個點做叉積,把答案累加起來

由於方向的問題,最後要取一個絕對值

又因為叉積算的是平行四邊形的面積,所以還要除以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;
}