zoukankan      html  css  js  c++  java
  • 半平面相交

    #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());
    }
    
  • 相关阅读:
    前端知识之JavaScript内容(一)
    前端2css层叠样式表
    前端:html初识以及标签
    css
    python--re模块(正则表达式)
    python--xml模块
    关于导包问题
    前端浅了解
    试写仿优酷系统坑点
    sqlalchemy
  • 原文地址:https://www.cnblogs.com/yesuweiYYYY/p/15544197.html
Copyright © 2011-2022 走看看