![:roll:](./images/smilies/icon_rolleyes.gif)
Code: Select all
#include<stdio.h>
int edgeType(int p_x,int p_y,int po_x0,int po_x1,int po_y0,int po_y1);
int pointClassify(int cp_x,int cp_y,int cpo_x0,int cpo_x1,int cpo_y0,int cpo_y1);
enum point {Outside,Inside,Boundary};
enum edge {Touching,Crossing,Inessential};
enum orientation{Left,Right,Between,Origin,Destination};
int main()
{
int poly_x[1000];int poly_y[1000];int point_x,point_y;int n;int parity=0;
//freopen("63.in","rb",stdin);
while(scanf("%d",&n)==1)
{
if(n==0)break;
else
{
parity=0;
for(int i=0;i<n;i++)
{
scanf("%d %d",&poly_x[i],&poly_y[i]);
}
scanf("%d %d",&point_x,&point_y);
for(int i=0;i<n-1;i++)
{
switch(edgeType(point_x,point_y,poly_x[i],poly_x[i+1],poly_y[i],poly_y[i+1]))
{
case Touching:
parity=0;
break;
case Crossing:
parity=1-parity;
break;
case Inessential:
parity=0;
break;
}
}
if(parity==1)
printf("T\n");
else
printf("F\n");
}
}
}
int edgeType(int p_x,int p_y,int po_x0,int po_x1,int po_y0,int po_y1)
{
switch(pointClassify(p_x,p_y,po_x0,po_x1,po_y0,po_y1))
{
case Left:
return ((po_y0<p_y)&&(p_y<=po_x1)) ? Crossing : Inessential;
break;
case Right:
return ((po_y1<p_y)&&(p_y<=po_y0)) ? Crossing : Inessential;
break;
case Between:
case Origin:
case Destination:
return Touching;
break;
default:
return Inessential;
break;
}
}
int pointClassify(int cp_x,int cp_y,int cpo_x0,int cpo_x1,int cpo_y0,int cpo_y1)
{
int a_x=cpo_x1-cpo_x0;int a_y=cpo_y1-cpo_y0;
int b_x=cp_x-cpo_x0;int b_y=cp_y-cpo_y0;
int sa=(a_x*b_y)-(b_x*a_y);
if(sa>0)
return Left;
else if(sa<0)
return Right;
else if(cpo_x0==cp_x&&cpo_y0==cp_y)
return Origin;
else if(cpo_x1==cp_x&&cpo_y1==cp_y)
return Destination;
else
return Between;
}
[size=85][/size]