【POJ 3907】Build Your Home(有向多边形的面积)
我们已经知道 两个向量的叉积就是他们所构成的平行四边形的面积
如果多边形是凸的 于是就可以从第一个顶点出发 把凸多边形分成n-2个三角形 通过叉积把面积加起来
其实多边形是凹的也适用 因为叉积算的是有向面积 一正一负便会抵消
#include<iostream> #include<cstdio> #include<iomanip> #include<cmath> #define N 1000005 #define eps 1e-6 using namespace std; struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y){} }p[N]; typedef Point Vector; Vector operator +(Vector a,Vector b) { return Vector(a.x+b.x,a.y+b.y); } Vector operator -(Vector a,Vector b) { return Vector(a.x-b.x,a.y-b.y); } Vector operator *(Vector a,double p) { return Vector(a.x*p,a.y*p); } Vector operator /(Vector a,double p) { return Vector(a.x/p,a.y/p); } bool operator <(const Point &a,const Point &b) { return a.x<b.x||(a.x==b.x&&a.y<b.y); //左边 或正下方 } double Dot(Vector a,Vector b) { return a.x*b.x+a.y*b.y; } double Len(Vector a) { return sqrt(Dot(a,a)); } double Angle(Vector a,Vector b) { return acos(Dot(a,b)/Len(a)/Len(b)); } double Cross(Vector a,Vector b) { return a.x*b.y-a.y*b.x; } int n; double PolygonArea() { double ans=0; for(int i=2;i<n;i++) ans+=Cross(p[i]-p[1],p[i+1]-p[1]); return fabs(ans/2); } int main() { while(true) { cin>>n; if(!n) break; for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y; cout<<fixed<<setprecision(0)<<(PolygonArea())<<'\n'; } }
QQ40523591~欢迎一起学习交流~