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

    是否有核:判断交点个数

  • 相关阅读:
    C版程序语法 (消除左递归)
    文法
    201506110248 实验报告
    组合数据类型
    UBUNTU四种版本的区别【转】
    MFC对话框程序屏蔽回车与ESC键,Tab键
    std::fstream打开中文路径名失败的问题原因、解决方法以及注意事项
    前进。。。。。。
    程序员学习能力提升三要素[转]
    java学习推荐资源
  • 原文地址:https://www.cnblogs.com/xyj1/p/11150836.html
Copyright © 2011-2022 走看看