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

    1.处理不等式

    2.处理平面直角坐标系问题

    3.如何判断多边形

    #include <bits/stdc++.h>
    #define M 50002 
    #define eps 1e-5
    using namespace std;
    int n,m,cnt,cnt1;
    struct edge
    {
        double x;
        double y;
    }e[M],e1[M];
    struct line
    {
        edge x;
        edge y;
        double d;    
    }l[M],q[M];
    int dcmp(double x)
    {
        if(fabs(x) < eps)return 0;
        return x < 0 ? -1:1;
    }
    edge operator + (edge a,edge b)
    {
        return (edge){a.x + b.x,a.y + b.y};
     } 
    edge operator - (edge a,edge b)
    {
        return (edge){a.x - b.x,a.y - b.y};
    }
    edge operator * (edge a,double b)
    {
        return (edge){a.x * b,a.y * b};
    }
    double operator * (edge a,edge b)
    {
        return a.x * b.y - a.y * b.x;
    }
    edge maru(line a,line b)
    {
        edge u = a.x - b.x;
        edge v = a.y - a.x;
        edge w = b.y - b.x;
        double t = (w * u) / (v * w); 
        return a.x + v * t;
    }
    int judge(line a,line b,line c)
    {
        edge o = maru(b,c);
        int d = dcmp((a.y - a.x) * (o - a.x));
        return d > 0 ? 0:1; 
    }
    bool cmp(line a,line b)
    {
        if(!dcmp(a.d - b.d))
        {
            return (a.y - a.x) * (b.y - a.x) > 0;
         }
         return a.d < b.d;
    }
    int main()
    {
        scanf("%d",&n);
        while(n--)
        {
            double lx,ly,bx,by,x,y;
            scanf("%d",&m);
            for(int i = 1;i <= m;i++)
            {
                scanf("%lf%lf",&x,&y);
                if(i == 1)
                {
                    lx = bx = x;
                    ly = by = y;
                    continue;
                }
                else 
                {
                    l[++cnt].x = (edge){lx,ly};
                    l[cnt].y = (edge){x,y};
                    lx = x;
                    ly = y;
                }
            }
            l[++cnt].x = (edge){lx,ly};
            l[cnt].y = (edge){bx,by};
        }
        for(int i = 1;i <= cnt;i++)
        {
            l[i].d = atan2(l[i].x.y - l[i].y.y,l[i].x.x - l[i].y.x);
        }
        sort(l + 1,l + cnt + 1,cmp);
        for(int i = 1;i < cnt;i++)
        {
            if(!dcmp(l[i].d - l[i + 1].d))continue;
            l[++cnt1] = l[i];
        }
        l[++cnt1] = l[cnt];
        cnt = cnt1;
        int b = 1,e = 0;
        q[++e] = l[1];
        q[++e] = l[2];
        for(int i = 3;i <= cnt;i++)
        {
            while(b < e && judge(l[i],q[e],q[e - 1]))e--;
            while(b < e && judge(l[i],q[b],q[b + 1]))b++;
            q[++e] = l[i];
        }
        while(b < e && judge(q[e],q[b],q[b + 1]))b++;
        while(b < e && judge(q[b],q[e],q[e - 1]))e--;
        q[e + 1] = q[b];
        cnt1 = 0;
        for(int i = b;i <= e;i++)
        {
            e1[++cnt1] = maru(q[i],q[i + 1]);
        }
        double ans = 0;
        e1[++cnt1] = e1[1];
        if(cnt1 > 2)
        {
            for(int i = 1;i <= cnt1;i++)
            {
                ans += e1[i] * e1[i + 1];
            }
        }
        printf("%0.3lf",fabs(ans) / 2.0);
        return 0;
    }

    是否有核:判断交点个数

  • 相关阅读:
    改造vant日期选择
    css3元素垂直居中
    npm综合
    (转)网页加水印方法
    Mac下IDEA自带MAVEN插件的全局环境配置
    隐藏注册控件窗口
    High performance optimization and acceleration for randomWalk, deepwalk, node2vec (Python)
    How to add conda env into jupyter notebook installed by pip
    The Power of WordNet and How to Use It in Python
    背单词app测评,2018年
  • 原文地址:https://www.cnblogs.com/xyj1/p/11150836.html
Copyright © 2011-2022 走看看