这段事件在做一个小游戏,就用到了点在多边形内部的判断,现把资料做个总结。
用得是射线法,总的来说就是 从点 向 x 轴正方向引一条射线,如果交与奇数个点则在内部,偶数个在外部,另外对一些特殊情况作了处理。如点在线上。
另外,用向量法(点在组成多边形的有向线段的同一侧),但是高中数学都还给老师了,还需要再学啊。
-------------------------------------------------------------------------------------------------------------------
参考资料:http://www.cnblogs.com/mazhenyu/archive/2010/06/13/1757855.html 之 四,其实也是射线法
4. 水平/垂直交叉点数判别法(适用于任意多边形)
http://blog.csdn.net/kome2000/article/details/4383054
http://blog.csdn.net/kome2000/article/details/4383040
---------------------------------------------------------------------------------
原来的代码
BOOL PtInPolygon (POINT p, LPPOINT ptPolygon, int nCount)
{
int nCross = 0;
for (int i = 0; i < nCount; i++)
{
POINT p1 = ptPolygon[i];
POINT p2 = ptPolygon[(i + 1) % nCount];
// 求解 y=p.y 与 p1p2 的交点
if ( p1.y == p2.y ) // p1p2 与 y=p0.y平行
continue;
if ( p.y < min(p1.y, p2.y) ) // 交点在p1p2延长线上
continue;
if ( p.y >= max(p1.y, p2.y) ) // 交点在p1p2延长线上
continue;
// 求交点的 X 坐标 --------------------------------------------------------------
double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
if ( x > p.x )
nCross++; // 只统计单边交点
}
// 单边交点为偶数,点在多边形之外 ---
return (nCross % 2 == 1);
}
Android代码
参数:要判断的点,多边形的所有顶点
private boolean isPolygonContainPoint(PointF pointF,PointF[] vertexPointFs){
int nCross = 0;
for (int i = 0; i < vertexPointFs.length; i++) {
PointF p1 = vertexPointFs[i];
PointF p2 = vertexPointFs[(i + 1) % vertexPointFs.length];
if (p1.y == p2.y)
continue;
if (pointF.y < Math.min(p1.y, p2.y))
continue;
if (pointF.y >= Math.max(p1.y, p2.y))
continue;
double x = (double) (pointF.y - p1.y) * (double) (p2.x - p1.x)
/ (double) (p2.y - p1.y) + p1.x;
if (x > pointF.x)
nCross++;
}
return (nCross % 2 == 1);
}
--------------------
如果有问题,希望大家提出来。谢谢