计算几何类型的题,判断点是否在多边形内,只是这个多边形变成了任意的多边形,这种情况下,用做射线的方法进行判定,要处理两种特殊情况1.正好交点在某个顶点上,这个在真正的算法语言描述里说是当和交点相连的另外两个点如果在交点的同一侧,则算是两个点,若异侧则算一个点,但是这个实现起来确实比较麻烦,其实这个可以用另外一个想法解决,和一个线段交于一个顶点时,如果交的点是两个点中,y坐标较大(或较小)的,则算是一个交点,这样其实等同于理论里的同侧异侧的解决办法
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 100 5 using namespace std; 6 int min(int a,int b) 7 { 8 return a<b?a:b; 9 } 10 int max(int a,int b) 11 { 12 return a>b?a:b; 13 } 14 struct point 15 { 16 int x,y; 17 }; 18 point p[N]; 19 int mul(point p1,point p2,point p3) 20 { 21 return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y); 22 } 23 bool cross(point p1,point p2,point p3,point p4) 24 { 25 if(min(p1.x,p2.x)>max(p3.x,p4.x)||max(p1.x,p2.x)<min(p3.x,p4.x)) 26 return false; 27 if(min(p1.y,p2.y)>max(p3.y,p4.y)||max(p1.y,p2.y)<min(p3.y,p4.y)) 28 return false; 29 if(mul(p1,p2,p3)*mul(p1,p2,p4)<=0&&mul(p3,p4,p1)*mul(p3,p4,p2)<=0) 30 return true; 31 return false; 32 } 33 int main() 34 { 35 int n,i,j,k; 36 point p1; 37 point p2; 38 int minx; 39 while(scanf("%d",&n)&&n) 40 { 41 scanf("%d%d",&p1.x,&p1.y); 42 minx=1000; 43 for(i=0;i<n;i++) 44 { 45 scanf("%d%d",&p[i].x,&p[i].y); 46 if(p[i].x<minx) 47 minx=p[i].x; 48 } 49 p2.x=minx-1; 50 p2.y=p1.y; 51 p[n].x=p[0].x; 52 p[n].y=p[0].y; 53 int sum=0; 54 bool q=false; 55 for(i=0;i<n;i++) 56 { 57 if(mul(p1,p[i],p[i+1])==0&&p1.x>=min(p[i].x,p[i+1].x)&&p1.x<=max(p[i].x,p[i+1].x)&&p1.y>=min(p[i].y,p[i+1].y)&&p1.y<=max(p[i].y,p[i+1].y)) 58 { 59 q=true; 60 break; 61 } 62 if(p[i].y==p[i+1].y) 63 { 64 continue; 65 } 66 if(cross(p1,p2,p[i],p[i+1])) 67 { 68 if(p1.y!=p[i].y&&p1.y!=p[i+1].y) 69 sum++; 70 else 71 { 72 if(min(p[i].y,p[i+1].y)==p1.y) 73 sum++; 74 } 75 //printf("%d %d\n",i,sum); 76 } 77 } 78 if(sum&1) 79 q=true; 80 if(q) 81 printf("Yes\n"); 82 else 83 printf("No\n"); 84 } 85 return 0; 86 }