int PtInRgn(POINT *xy, int points, POINT *p) //xy--多边形顶点坐标串地址;points--顶点数;p—任一点坐标 // return(0)--点p在轮廓上;return(1)--点p在多边形内;return(-1)--点p在多边形外 { int i, CrossPoints=0; int xmin, ymin, xmax, ymax; double x; for(i=0; i<points-1; i++) { xmin=min((xy+i)->x, (xy+i+1)->x); xmax=max((xy+i)->x, (xy+i+1)->x); ymin=min((xy+i)->y, (xy+i+1)->y); ymax=max((xy+i)->y, (xy+i+1)->y); if(p->y>ymax || p->y<ymin) continue; //水平射线不可能与轮廓线段i->i+1有交 if(p->y==ymax) { if(ymax==(xy+i)->y && p->x==(xy+i)->x || ymax==(xy+i+1)->y && p->x==(xy+i+1)->x) return(0); // p位于多边形轮廓上 else if(ymin==ymax) { if(p->x>=xmin && p->x<=xmax) return(0); // p位于多边形轮廓上 } continue; // 放弃求交(避免重复交点) } //计算水平射线与轮廓线段i->i+1交点的x值 x=(double)(p->y-(xy+i)->y)/((xy+i+1)->y-(xy+i)->y)*((xy+i+1)->x-(xy+i)->x)+(xy+i)->x; if(x==p->x) return(0); // p位于多边形轮廓上 if(x>p->x) CrossPoints++; // 统计位于p右方的交点数 } if(CrossPoints%2==0) return(-1); // p在多边形外 else return(1); // p在多边形内 }