凸包

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;
}

你可能感兴趣的:(凸包)