判断一个点在多边形的内外关系
2012-03-12 17:46
85 查看
http://hi.baidu.com/alpc62/blog/item/9873f911b27a107cca80c489.html
已知一个点和一个多边形,怎么让傻乎乎的计算机判断出点在形内形外呢?这里定义多边形边集也为多边形内部。
常见的有两种方法:
1.射线法。从这个点向右水平发出一条射线,如果交点个数是偶数则在形内,奇数在形外。有一个弊端:如果这条射线恰好与这条边重合了,交点个数怎么算?常见的是将这条射线向上微移,不过不少人觉得这样做很不放心。
2.环顾法。顾名思义,就是环顾一圈:从一个顶点按照顺时针顺序环顾,旋转的极角累加,如果等于360度就是形内、0度是形外,介于两者之间即为边上。这种方法很完美,但代价是其中计算除法和arccos的速度太慢,大约比射线法慢20倍。
我比较倾向射线法+微移,所谓微移只是意识上的微移,在代码中射线是没有变化的、判断条件改变了一下:
1.叉积大于0
2.对于多边形某条边,设顶点高的为A,低的为B,则需要满足A严格高于射线、B不高于(低于或等于)射线
同时满足1和2就算作有一个交点。为防止另一种bug的发生(不细讲估计看的也有点儿不耐烦了),在遍历边的同时一旦发现此点在边上停止计算,结果即为形内。这样射线发也完美无BUG了。
下面我写的还没有经过测试,仅供参考;如果哪位发现了BUG,请留言与此,一起改正。
//这里使用了基础函数的point定义,dblcmp、cross、betweenmp函数
//以后凡是计算几何的代码都会用到那篇文章里的东西,不再重复
bool inpolyon(point a)
{
int h,i,j,k,t=0;
for (h=1;h<=n;h++)
{
i=h;
j=h+1;
if (j==n+1) j=1;
if (dblcmp(d[i].y-d[j].y)==-1) k=i,i=j,j=k;
k=dblcmp(cross(a,d[j],d[i]));
if (!k)
{
if (betweencmp(a,d[j],d[i])<=0) return true;
}
else if (k>0 && dblcmp(d[i].y-a.y)==1 && dblcmp(d[j].y-a.y)<=0) t++;
}
if (t%2) return true;
return false;
}
已知一个点和一个多边形,怎么让傻乎乎的计算机判断出点在形内形外呢?这里定义多边形边集也为多边形内部。
常见的有两种方法:
1.射线法。从这个点向右水平发出一条射线,如果交点个数是偶数则在形内,奇数在形外。有一个弊端:如果这条射线恰好与这条边重合了,交点个数怎么算?常见的是将这条射线向上微移,不过不少人觉得这样做很不放心。
2.环顾法。顾名思义,就是环顾一圈:从一个顶点按照顺时针顺序环顾,旋转的极角累加,如果等于360度就是形内、0度是形外,介于两者之间即为边上。这种方法很完美,但代价是其中计算除法和arccos的速度太慢,大约比射线法慢20倍。
我比较倾向射线法+微移,所谓微移只是意识上的微移,在代码中射线是没有变化的、判断条件改变了一下:
1.叉积大于0
2.对于多边形某条边,设顶点高的为A,低的为B,则需要满足A严格高于射线、B不高于(低于或等于)射线
同时满足1和2就算作有一个交点。为防止另一种bug的发生(不细讲估计看的也有点儿不耐烦了),在遍历边的同时一旦发现此点在边上停止计算,结果即为形内。这样射线发也完美无BUG了。
下面我写的还没有经过测试,仅供参考;如果哪位发现了BUG,请留言与此,一起改正。
//这里使用了基础函数的point定义,dblcmp、cross、betweenmp函数
//以后凡是计算几何的代码都会用到那篇文章里的东西,不再重复
bool inpolyon(point a)
{
int h,i,j,k,t=0;
for (h=1;h<=n;h++)
{
i=h;
j=h+1;
if (j==n+1) j=1;
if (dblcmp(d[i].y-d[j].y)==-1) k=i,i=j,j=k;
k=dblcmp(cross(a,d[j],d[i]));
if (!k)
{
if (betweencmp(a,d[j],d[i])<=0) return true;
}
else if (k>0 && dblcmp(d[i].y-a.y)==1 && dblcmp(d[j].y-a.y)<=0) t++;
}
if (t%2) return true;
return false;
}
相关文章推荐
- 计算几何工具算法-判断点与一个多边形的位置关系
- OpenGL 如何判断点在多边形的内外关系
- LightOJ1190->判断一个点是不是在一个任意多边形内
- HDU 1756 判断点在多边形内外
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- js判断一个地图标注点是否在多边形区域里
- 判断一个点是否在一个多边形内部
- A Round Peg in a Ground Hole(判断是否是凸包,点是否在凸包内,圆与多边形的关系)
- Java 判断一个点是否在多边形区域内
- C++ 点在多边形内算法——判断一个点是否在一个复杂多边形的内部
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- 如何判断一个点是否在一个多边形内部+三角形有向面积公式
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部
- 判断一个点是否位于一个凸多边形内的方法
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部翻译 (转)
- 判断一个点是否落在多边形内
- Android如何判断一个点在不在多边形区域内
- 判断一个点是否在多边形内部 [1] 射线法思路
- POJ 3335 判断一个多边形是否存在核