zoukankan      html  css  js  c++  java
  • 计算几何,向量——cf995c

    网上的题解直接用随机过的,

    自己用模拟就模拟三个向量的和并就模拟不出来。。

    以后再回头看看

    #include<bits/stdc++.h>
    #include<cmath>
    using namespace std;
     
    const double esp = 1e-8;
    const int maxn = 1e5+10;
    const double C = 180.0/acos(-1.0);
    struct Vector{
        double x,y,len,angle;
        int k,id;
    }p[maxn];
    int cmp(Vector a,Vector b){return a.len>b.len;}
    int n;
     
    void reverse(Vector &v){
        v.k*=-1;v.x*=-1;v.y*=-1;
        v.angle=atan2(v.y,v.x)*C;
        if(v.angle<0)v.angle+=360;
    }
    void add(Vector &a, Vector &b){
        a.x+=b.x;a.y+=b.y;
        a.len=sqrt(a.x*a.x+a.y*a.y);
        a.angle=atan2(a.y,a.x)*C;
        if(a.angle<0)a.angle+=360;
    }
     
    void Merge(Vector &a,Vector &b,Vector &c){//把c向量加到a向量或者b向量里 
        double r1=a.angle,r2=c.angle;
        if(r1>r2)swap(r1,r2);
        double A=min(fabs(r2-r1),fabs(r1-r2+360));
        if(A<=180 && A>=120){//形成钝角 
            add(a,c);return; 
        }
        else if(A<=60){//形成锐角 
            reverse(c);
            add(a,c);
            return;
        }
        
        r1=b.angle,r2=c.angle;
        if(r1>r2)swap(r1,r2);
        double B=min(fabs(r2-r1),fabs(r1-r2+360));
        if(B<=180 && B>=120){
            add(b,c);return;
        }
        else if(B<=60){//形成锐角 
            reverse(c);
            add(b,c);
            return;
        }
        
        Vector tmp=b;b=c;c=tmp;
        
        r1=a.angle,r2=c.angle;
        if(r1>r2)swap(r1,r2);
        A=min(fabs(r2-r1),fabs(r1-r2+360));
        if(A<=180 && A>=120){//形成钝角 
            add(a,c);return; 
        }
        else if(A<=60){//形成锐角 
            reverse(c);
            add(a,c);
            return;
        }
    }
     
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
            p[i].len=sqrt(p[i].x*p[i].x+p[i].y*p[i].y);
            p[i].angle=atan2(p[i].y,p[i].x)*C;
            if(p[i].angle<0)
                p[i].angle+=360; 
            p[i].id=i;p[i].k=1;
        }
        sort(p+1,p+1+n,cmp);
        
        Vector &a=p[1], &b=p[2];
        for(int i=3;i<=n;i++){
            Vector &c=p[i];
            Merge(a,b,c);
            if((a.x+b.x)*(a.x+b.x)>=2.25*1e12)
                cout<<i<<" NO";
        
        }
        /*
    cout<<a.x<<" "<<a.y<<'
    ';
    cout<<b.x<<" "<<b.y<<'
    ';*/
    
        int ans[maxn]={};
        for(int i=1;i<=n;i++)
            ans[p[i].id]=p[i].k;
        for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
    }
  • 相关阅读:
    DXF文件格式理解
    Qt Creator调试命令行参数
    qt编译错误:invalid new-expression of abstract class type "*"
    dxf文件解析库libdxf初探
    ubuntu linux编译libdxfrw
    CAD DWG/DXF文件C++解析库libdxfrw
    AutoCAD版本dxf文件与dxflib解析库支持探索
    Linux 6种日志查看方法(转)
    码率、分辨率、帧率和画质计算单位时间码流大小(转)
    纯手工打造车载车牌识别检测系统(转)
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11109149.html
Copyright © 2011-2022 走看看