判断点与多边形的状态(位置)

接上次的文章
考虑不周,请多指教

原理
先通过点做向右的一条射线
如果射线与多边形相交的点为奇数,则在多边形内。
是否相交判断:
1。判断在边的左边或右边(也有可能在线段上或线段的延伸线上)
2。判断点的Y值是否在线段两个端点Y值之间

所有边(点在此边之左)的和如果是奇数,则在多边形内

特殊情况处理:
第一种情况可不考虑
第二种情况认为没有交点(有无数个交点),在线段的延伸线上


代码如下:
///

1<summary>   
2///   
3/// </summary>

///

1<param name="mpPt"/>

///

1<param name="ply"/>

///

1<returns>0:在多边形外 1:在多边形内 5:点在多边形边上 </returns>

public static int PtInPolygon( MapPoint mpPt,MapPolygon ply)
{
int iRightCross = 0; //射线与多边形边相交的个数

MapPoint mpNext = null;
for( int i=0; i

 1<ply.ptscount; !="0" )="" 5;="" else="" i="ply.PtsCount-1" i++="" if(="" int="" ire="" mpnext="ply[i+1];" mppt.x,mppt.y,ply[i].x,ply[i].y,mpnext.x,mpnext.y);="" ply[i].y="" return="" {="" 在多边形边上=""> mpNext.Y )   
 2{   
 3if( mpPt.Y &lt;= ply[i].Y &amp;&amp; mpPt.Y &gt;= mpNext.Y )   
 4{//与判断点的水平线相交   
 5if( iRe == 1 )   
 6iRightCross++;   
 7}   
 8}   
 9else   
10{   
11if( mpPt.Y &lt;= mpNext.Y &amp;&amp; mpPt.Y &gt;= ply[i].Y )   
12{   
13if( iRe == 1 )   
14iRightCross++;   
15}   
16}   
17}   
18}   
19return iRightCross % 2;   
20} 
21
22代码怎么贴好看一点? ![](http://blog.csdn.net/Emoticons/71_71.gif)</ply.ptscount;>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus