二维平面上点与线段关系的判定

二维平面上点与线段关系的判定

     问题的基本模型是:已知平面上一线段AB,判定平面上一点C相对于AB的位置(C不和AB共线)。

通过向量叉积来判定线段与点的的位置关系。

                        

   例题:Toys (http://poj.org/problem?id=2318)

//判断点于线段的位置关系 #include<iostream> #include<cstdio> #include<stdlib.h> # define N 5010 using namespace std; typedef struct Node { int x,y; }Point; Point up[N],dw[N]; int ans[N],cnt; int cross(Point a,Point b,Point o) { return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y); } int find(Point t) { for(int i=0;i<cnt-1;i++) if(cross(t,up[i],dw[i])>0 && cross(t,up[i+1],dw[i+1])<0) return i; } int main() { int n,m,x1,y1,x2,y2; while(scanf("%d",&n),n) { scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); cnt=0; up[cnt].x=x1;up[cnt].y=y1; dw[cnt].x=x1;dw[cnt++].y=y2; for(int i=0;i<n;i++) { int u,l; scanf("%d%d",&u,&l); up[cnt].x=u;up[cnt].y=y1; dw[cnt].x=l;dw[cnt++].y=y2; } up[cnt].x=x2;up[cnt].y=y1; dw[cnt].x=x2;dw[cnt++].y=y2; memset(ans,0,sizeof(ans)); Point t; for(int i=0;i<m;i++) { scanf("%d%d",&t.x,&t.y); ans[find(t)]++; } for(int i=0;i<cnt-1;i++) printf("%d: %d/n",i,ans[i]); printf("/n"); } return 0; }

你可能感兴趣的:(c,struct,ini,UP)