接上次的文章 考虑不周,请多指教
原理 先通过点做向右的一条射线 如果射线与多边形相交的点为奇数,则在多边形内。 是否相交判断: 1。判断在边的左边或右边(也有可能在线段上或线段的延伸线上) 2。判断点的Y值是否在线段两个端点Y值之间
所有边(点在此边之左)的和如果是奇数,则在多边形内
特殊情况处理: 第一种情况可不考虑 第二种情况认为没有交点(有无数个交点),在线段的延伸线上 
代码如下: /// <summary> /// /// </summary> /// <param name="mpPt"></param> /// <param name="ply"></param> /// <returns>0:在多边形外 1:在多边形内 5:点在多边形边上 </returns> public static int PtInPolygon( MapPoint mpPt,MapPolygon ply) { int iRightCross = 0; //射线与多边形边相交的个数
MapPoint mpNext = null; for( int i=0; i<ply.PtsCount; i++ ) { if( i == ply.PtsCount-1 ) mpNext = ply[0]; else mpNext = ply[i+1]; int iRe = PtInLine( mpPt.X,mpPt.Y,ply[i].X,ply[i].Y,mpNext.X,mpNext.Y); if( iRe == 5 )//在多边形边上 return 5; else if( iRe != 0 ) { if( ply[i].Y > mpNext.Y ) { if( mpPt.Y <= ply[i].Y && mpPt.Y >= mpNext.Y ) {//与判断点的水平线相交 if( iRe == 1 ) iRightCross++; } } else { if( mpPt.Y <= mpNext.Y && mpPt.Y >= ply[i].Y ) { if( iRe == 1 ) iRightCross++; } } } } return iRightCross % 2; }
代码怎么贴好看一点?

|