struct Point { double x,y; }; struct King{ Point b[maxn]; double area; int mark; int lenk; }; bool compare(Point a1,Point a2){ if((a1.x-fx)*(a2.y-fy)==(a1.y-fy)*(a2.x-fx)){ if(a1.y == a2.y) return a1.x < a2.x; else return a1.y < a2.y; } return (a1.x-fx)*(a2.y-fy)>(a1.y-fy)*(a2.x-fx); } double dot(double x1,double y1,double x2,double y2){ return x1 * y2 - x2 * y1; } double cross(Point a1,Point a2,Point a3){ //计算两个向量的夹角 大于零 return (a2.x-a1.x)*(a3.y-a2.y)-(a3.x-a2.x)*(a2.y-a1.y); } int ConvexHull(Point * p,Point * ans,int t){ //构造凸包 p所有点 ans凸包外围点 t点个数 返回外围点个数 for(int i=1;i<t;i++){ if(p[i].y==p[0].y){ if(p[i].x<p[0].x)swap(p[i],p[0]); } else if(p[i].y<p[0].y){ swap(p[i],p[0]); } } fx = p[0].x; fy = p[0].y; sort(p,p+t,compare); int k=0; for(int j=0;j<t;j++){ while(k>=2&&cross(ans[k-2],ans[k-1],p[j])<0){ k--; } ans[k++] = p[j]; } return k; } double GetArea(Point * ans,int lenc){ double Area = 0; for(int i=0;i<lenc;i++){ Area += dot(ans[i].x,ans[i].y,ans[(i+1)%lenc].x,ans[(i+1)%lenc].y); } //cout<<Area<<endl; return Area; } int is_inside(double x1,double y1,King a1){ //点在不在凸包内 包括边界 double TempArea = 0; for(int i=0;i<a1.lenk;i++){ TempArea += fabs(dot(a1.b[i].x-x1,a1.b[i].y-y1,a1.b[(i+1)%a1.lenk].x-x1,a1.b[(i+1)%a1.lenk].y-y1)); } //printf("%lf %lf\n",TempArea,a1.area); if(fabs(TempArea-a1.area)<eps) return 1; else return 0; }