计算几何问题,基本思想从要判断的点引一条射线看和多边形交点的个数,如果是奇数个,那么就在多边形内,否则在多边形外。先判断点是否在多边形边上的情况判掉,再判断线段相交。
const double Max = 100000000;
double CrossMultiply(const Point& a,const Point& b,const Point& c)
return x1 * y2 - x2 * y1;
double interSect(const Point& a,const Point& b,const Point& c,const Point& d)
d1 = CrossMultiply(a,b,c),
d2 = CrossMultiply(a,b,d),
d3 = CrossMultiply(c,d,a),
d4 = CrossMultiply(c,d,b);
if((d1 * d2) < 0 && (d3 * d4) < 0)
else if((d1 * d2) == 0 || (d3 * d4) == 0)
bool IsOnEdge(const Point& p,const vector<Point>& ptVect)
int i,j,size,minX,maxX,minY,maxY;
size = ptVect.size();//点的数目
if (CrossMultiply(ptVect[i],ptVect[j],p)==0)
if (p.x>=min(ptVect[i].x,ptVect[j].x)&&p.x<=max(ptVect[i].x,ptVect[j].x)&&p.y>=min(ptVect[i].y,ptVect[j].y)&&p.y<=max(ptVect[i].y,ptVect[j].y))
bool isInside(const Point& p,const vector<Point>& ptVect)
for(i = 0 ; i <size; ++i)
d = interSect(p,pc,ptVect[i],ptVect[j]);
if(ptVect[i].y > 0 || ptVect[j].y > 0)
cin>>points[i].x>>points[i].y;
pointVect.push_back(points[i]);
cout << "Problem " << ++cases<< ":" << endl;
pc.x = Max,pc.y = p.y;//故意把射线点选择在同一水平线,无穷远处
if (IsOnEdge(p,pointVect))
else if (isInside(p,pointVect))
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/30/1323289.html,如需转载请自行联系原作者