• 半平面相交


    #include<bits\stdc++.h>
    using namespace std;
    const int N=600;
    const double eps= 1e-10;
    struct P{
        double x,y;
        P(){x=y=0;}
        P(double _x,double _y){x=_x,y=_y;}
        P operator-(const P&a)const{return P(x-a.x,y-a.y);}
        P operator+(const P&a)const{return P(x+a.x,y+a.y);}
        P operator*(double a)const{return P(x*a,y*a);}
        void read(){scanf("%lf%lf",&x,&y);}
    }p[N],a[N];
    struct L{
        //
        P p,v;double a;
        L(){}
        L(P _p,P _v){p=_p,v=_v;}
        bool operator<(const L&b)const{return a<b.a;}
        void cal(){a=atan2(v.y,v.x);}
    }line[N],q[N];
    int n,m,i,cl;
    //叉积
    double cross(const P&a,const P&b){return a.x*b.y-a.y*b.x;}
    //新的半平面,在这条向量a->b的逆时针方向
    // 插入新直线
    void newL(const P&a,const P&b){line[++cl]=L(a,b-a);}
    // 顺时针?
    bool left(const P&p,const L&l){return cross(l.v,p-l.p)>0;}
    
    // 面积的交集
    P pos(const L&a,const L&b){
        P x=a.p-b.p;double t=cross(b.v,x)/cross(a.v,b.v);
        return a.p+a.v*t;
    }
    // 主代码
    double halfplane(){
        // 直线计算斜率
        for(int i=1;i<=cl;i++)line[i].cal();
        // 边排序(极角排序)
        sort(line+1,line+cl+1);
        // 双端队列
        int h=1,t=1;
        // 边1入队
        q[1]=line[1];
        for(int i=2;i<=cl;i++){
    //       出队
    //      队伍非空+顺时针方向
            while(h<t&&!left(p[t-1],line[i]))t--;
    //        入队
    //      队伍空
            while(h<t&&!left(p[h],line[i]))h++;
    //      在队列里、
            if(fabs(cross(q[t].v,line[i].v))<eps)
                q[t]=left(q[t].p,line[i])?q[t]:line[i];
            else q[++t]=line[i];
            if(h<t)
                p[t-1]=pos(q[t],q[t-1]);
        }
        while(h<t&&!left(p[t-1],q[h]))t--;
        p[t]=pos(q[t],q[h]);
        if(t-h<=1)return 0;
        double ans=0;
        for(int i=h;i<t;i++)ans+=cross(p[i],p[i+1]);
        return (ans+cross(p[t],p[h]))/2;
    }
    int main(){
        scanf("%d",&n);
        while(n--){
            scanf("%d",&m);
            for(i=0;i<m;i++)a[i].read();
            for(i=0;i<m;i++)newL(a[i],a[(i+1)%m]);
        }
        printf("%.3f",halfplane());
    }
    
  • 相关阅读:
    ScottGu: 宣布微软 AJAX CDN
    表格数据流协议TDS
    .NET 4 System.Threading.Barrier 类
    企业架构思考
    OpenSSL的托管项目
    WCF服务中操作FormsAuthentication的Cookie
    Silverlight相关博客收集20090927
    Sync Framework 2.0
    [中央电视台·见证]大学堂——兰州大学
    系统进程管理工具Process Explorer
  • 原文地址:https://www.cnblogs.com/yesuweiYYYY/p/15544197.html
Copyright © 2020-2023  润新知