判断点是否在多边形内、模版题、我也只会套模版了、、
#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;
}