zoj 1081 Points Within

判断点是否在多边形内、模版题、我也只会套模版了、、

#include <bits/stdc++.h>
using namespace std;
const int maxn=105;  //多边形点的个数
const double eps=1e-8;
int cmp(double x)
{
    if (fabs(x)<eps) return 0;
    if (x>0) return 1;
    return -1;
}

const double pi =acos(-1.0);
inline double sqr(double x)
{
    return x*x;
}



struct point
{
   double x,y;
   point() {}
   point(double a,double b):x(a),y(b) {}
   void input()
   {
       scanf("%lf%lf",&x,&y);
   }
   friend point operator + (const point &a,const point &b)
   {
       return point (a.x+b.x,a.y+b.y);
   }
   friend point operator - (const point &a,const point &b)
   {
       return point (a.x-b.x,a.y-b.y);
   }
   friend bool operator == (const point &a,const point &b)
   {
       return cmp(a.x-b.x)==0&&cmp(a.y-b.y)==0;
   }
   friend point operator * (const point &a,const double &b)
   {
       return point (a.x*b,a.y*b);
   }
   friend point operator * (const double &a,const point &b)
   {
       return point (a*b.x,a*b.y);
   }
   friend point operator / (const point &a,const double &b)
   {
       return point (a.x/b,a.y/b);
   }
   double norm()
   {
       return sqrt(sqr(x)+sqr(y));
   }
};


double det(const point &a,const point &b)
{
    return a.x*b.y-a.y*b.x;
}
double dot(const point &a,const point &b)
{
    return a.x*b.x+a.y*b.y;
}
double dist (const point &a,const point &b)
{
    return (a-b).norm();
}
point rotate_point(const point &p,double A)
{
    double tx=p.x,ty=p.y;
    return point(tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));
}



bool PointOnSegment (point p,point s,point t)
{
    return cmp(det(p-s,t-s))==0&&cmp(dot(p-s,p-t))<=0;
}


struct polygon
{
    int n;
    point a[maxn];
    polygon(){}
    int Point_In(point t)
    {
        int num=0,i,d1,d2,k;
        a[n]=a[0];
        for (i=0;i<n;i++){
            if (PointOnSegment(t,a[i],a[i+1])) return 2;
            k=cmp(det(a[i+1]-a[i],t-a[i]));
            d1=cmp(a[i].y-t.y);
            d2=cmp(a[i+1].y-t.y);
            if (k>0&&d1<=0&&d2>0){
                num++;
            }
            if (k<0&&d2<=0&&d1>0){
                num--;
            }
        }
        return num!=0;
    }
};


int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n;
    int testcase=1;
    while(scanf("%d",&n)!=EOF&&n){
        if (testcase!=1) printf("\n");
        int m;scanf("%d",&m);
        polygon pp;pp.n=n;
        for (int i=0;i<n;i++){
            pp.a[i].input();
        }
        printf("Problem %d:\n",testcase++);
        for (int i=0;i<m;i++){
            point sss;
            sss.input();

            if (pp.Point_In(sss)!=0){
                printf("Within\n");
            } else printf("Outside\n");
        }

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值