python 判断点在随机多边形内_判断点是否在多边形内部

如何判断一个点是否在多边形内部?

(1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。

(2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。

(3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。

具体做法:将测试点的Y坐标与多边形的每一个点进行比较,会得到一个测试点所在的行与多边形边的交点的列表。在下图的这个例子中有8条边与测试点所在的行相交,而有6条边没有相交。如果测试点的两边点的个数都是奇数个则该测试点在多边形内,否则在多边形外。在这个例子中测试点的左边有5个交点,右边有三个交点,它们都是奇数,所以点在多边形内。

算法图解:

关于这个算法的具体的更多图形例子:http://alienryderflex.com/polygon/

参考代码:

int pnpoly(int nvert, float *vertx, float *verty, float testx, floattesty)

{int i, j, c = 0;for (i = 0, j = nvert-1; i < nvert; j = i++)

{if ( ((verty[i]>testy) != (verty[j]>testy)) &&(testx< (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) +vertx[i]) )

c= !c;

}returnc;

}

来自一个polygon的内部实现:

public boolIsInside(PointLatLng p)

{int count =Points.Count;if(count < 3)

{return false;

}bool result = false;for(int i = 0, j = count - 1; i < count; i++)

{var p1 =Points[i];var p2 =Points[j];if(p1.Lat < p.Lat && p2.Lat >= p.Lat || p2.Lat < p.Lat && p1.Lat >=p.Lat)

{if(p1.Lng + (p.Lat - p1.Lat) / (p2.Lat - p1.Lat) * (p2.Lng - p1.Lng)

{

result= !result;

}

}

j=i;

}returnresult;

}

特殊情况:要检测的点在多变形的一条边上,射线法判断的结果是不确定的,需要特殊处理(If the test point is on the border of the polygon, this algorithm will deliver unpredictable results)。

计算一个多边形的面积(area of a polygon):

private static double SignedPolygonArea(Listpoints)

{//Add the first point to the end.

int pointsCount =points.Count;

PointLatLng[] pts= new PointLatLng[pointsCount + 1];

points.CopyTo(pts,0);

pts[pointsCount]= points[0];for (int i = 0; i < pointsCount + 1; ++i)

{

pts[i].Lat= pts[i].Lat * (System.Math.PI * 6378137 / 180);

pts[i].Lng= pts[i].Lng * (System.Math.PI * 6378137 / 180);

}//Get the areas.

double area = 0;for (int i = 0; i < pointsCount; i++)

{

area+= (pts[i + 1].Lat - pts[i].Lat) * (pts[i + 1].Lng + pts[i].Lng) / 2;

}//Return the result.

returnarea;

}///

///Get the area of a polygon///

///

///

public static double GetPolygonArea(Listpoints)

{//Return the absolute value of the signed area.//The signed area is negative if the polygon is oriented clockwise.

returnMath.Abs(SignedPolygonArea(points));

}

参考资料:

http://alienryderflex.com/polygon/

http://en.wikipedia.org/wiki/Point_in_polygon

http://www.codeproject.com/Tips/84226/Is-a-Point-inside-a-Polygon

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值