标签:心态 class lib 准备 范围 算法 打油诗 判断 核心
计算几何裸题。叉积裸题。
将多边形拆成三角形,叉积计算平行四边形面积,答案累计,最后/2就好了。
注意题目给出的点是按逆时针顺序,注意有向面积的正负。
矢量叉积:
计算矢量叉积是与直线和线段相关算法的核心部分。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在不加说明的情况下,本文下述算法中所有的点都看作矢量,两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
1 #include<set> 2 #include<map> 3 #include<ctime> 4 #include<cmath> 5 #include<queue> 6 #include<stack> 7 #include<cstdio> 8 #include<string> 9 #include<vector> 10 #include<cstring> 11 #include<cstdlib> 12 #include<iostream> 13 #include<algorithm> 14 #define LL long long 15 #define RE register 16 #define IL inline 17 using namespace std; 18 19 struct Point 20 { 21 double x,y; 22 Point (){} 23 Point (double _x,double _y){x=_x;y=_y;} 24 Point operator - (const Point &B) 25 const{ 26 return Point(x-B.x,y-B.y); 27 } 28 int operator * (const Point &B) 29 const{ 30 return x*B.y-B.x*y; 31 } 32 }a,b,c; 33 int n; 34 35 int main() 36 { 37 scanf("%d",&n); 38 while (n) 39 { 40 double ans; 41 scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y); 42 ans=(a-c)*(b-c); 43 for (RE int i=4;i<=n;i++) 44 { 45 b=c; 46 scanf("%lf%lf",&c.x,&c.y); 47 ans+=(a-c)*(b-c); 48 } 49 ans=ans/2; 50 printf("%.1lf\n",ans); 51 scanf("%d",&n); 52 } 53 return 0; 54 }
标签:心态 class lib 准备 范围 算法 打油诗 判断 核心
原文地址:http://www.cnblogs.com/NaVi-Awson/p/7258310.html