叉积求多边形面积

来源:互联网 发布:php ceil 编辑:程序博客网 时间:2024/05/19 13:56
/*   两个向量P1和P2的叉积P1^P2的绝对值看作是由点(0,0),p1,p2和p1+p2四点围成的平行四边形的阴影面积,即原点,P1和P2围成的三角形面积S=|P1^P2|/2;   由此,我们可以利用叉积计算多边形的面积。设多边形的顶点按照顺时针方向排序为P0...p(n-1)。为使多边形的边首边尾相接,另设Pn=p0.多边形面积S=(|P(0)^P(1)+...+P(i)^p(i+1)|)/2*//*  poj 1654    计算一个特殊对多边形的面积。这个多边形的一个顶点时直角坐标系的原点。从这个原点出发,可以一步一个顶点的走向多边形的下一个顶点,直到回到初始顶点。每一步可以向北,西,南,或东走一个单位,或者向西北,东北,西南或者东南走2的平方根单位长度。输入:第一行给出一个整数t,表示测试的多边形的个数,接下来的每一行给出一个字符串,由1到9组的,这里8,2,6和4分别是向北,南,东和西,而9,7,3和1分别表示向东北,西北,东南和西南。数字5仅出现序列的结束时候。每行多达1000000位输出:一行给出其面积*/#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;const double epsi=1e-10;const int MAXN=100005;struct Point{__int64 x,y;Point (double _x=0, double _y=0 ) :x(_x),y(_y){}Point operator + (const Point &op2) const{return Point(x+op2.x,y+op2.y);}__int64 operator ^(const Point &op2) const{return x*op2.y-y*op2.x;}};inline int sign( const double &x){if(x>epsi) return 1;if(x<epsi) return -1;return 0;}int main(){int test=0;string s;__int64 ans;scanf("%d\n",&test);for(;test;test--){cin>>s;ans=0;Point p=Point(0,0),pl;for(int i=0;i<s.size();i++){if(s[i]=='1') pl=p+Point(-1,-1);            if(s[i]=='2') pl=p+Point(0,-1);if(s[i]=='3') pl=p+Point(1,-1);            if(s[i]=='4') pl=p+Point(-1,0);if(s[i]=='5') pl=Point(0,0);            if(s[i]=='6') pl=p+Point(1,0);if(s[i]=='7') pl=p+Point(-1,1);            if(s[i]=='8') pl=p+Point(0,1);if(s[i]=='9') pl=p+Point(1,1);ans+=p^pl;p=pl;}if(ans<0) ans=-ans;printf("%I64d",ans/2);if(ans%2) printf(".5");cout<<endl;}return 0;}

0 0
原创粉丝点击