点在多边形算法
1. java中怎么设计一个算法实现一个点是否在一个多边形内
射线法判断一个点是否在一个多边形内
http://hi..com/xiaoheng199110/item/a63ae6fbfab88e1efe358237
2. 求随意输入N个点围成一个边不相交的多边形的算法。用TC实现。帮帮忙。。。
你试试看,没有经过验证
1 生成Delaunay三角网
2 对每一个顶点进行处理,去掉该点相连的边
去除规则
a 每个顶点有且只要两条边
b 除最后一个顶点,在去除过程中不可出现一个三角形
有两个顶点已经符合条件a
3. 如何判定一个点在多边形的内部还是外部,用delphi怎么编程啊
这个问题需要分情况考虑:
1.如果给定的多边形是凸多边形,则可以按照我之前回答另外一个相似问题的答案来进行判断。这是传送门:【网络软件研发工程师面试题】给定一个凸四边形,如何判断一个点在这个凸四边形内还是外?
2.如果给定的多边形是凹多边形,那么就麻烦一点了。需要这样:先在凹多边形上添加一些边,使得凹多边形变成凸多边形,然后再按照第一步的方法去判断。示例图如下:
对于凹多边形ABCDEFGH,补边BE和FH(图中虚线所示),则可以构成三个凸多边形:凸多边形ABEFH,凸多边形BCDE和凸多边形FGH,然后判断给定点与这三个凸多边形的关系。
如果给定点在凸多边形ABEFH内部,而在凸多边形BCDE和凸多边形FGH的外部,那么就可以说明给定点在多边形ABCDEFGH的内部了。
下面就分别说明如何判断一个三角形是逆时针还是顺时针,如何判断一个多边形的凹凸性,如何补边,以及如何通过补边构造凸多边形。只要构造出所有的凸多边形,就可以按照上述第二种情况判断了。
判断一个三角形的顺时针还是逆时针
(学过3D渲染的同学应该知道,这个判断很重要,涉及到3D空间中哪些三角形需要渲染,而哪些三角形不需要渲染)
可以利用矢量叉积来判断一个给定的三角形是逆时针还是顺时针。
假设给定三角形的三个顶点A(x1,y1),B(x2,y2),C(x3,y3),构造三角形两边的矢量分别是:
AB=(x2-x1,y2-y1), AC=(x3-x1,y3-y1)
则AB和AC的叉积为:
|x2-x1, y2-y1|
|x3-x1, y3-y1|
值为:r = (x2-x1)(y3-y1) - (y2-y1)(x3-x1)
然后利用右手法则进行判断:
如果r>0,则三角形ABC是逆时针的
如果r<0,则三角形ABC是顺时针的
这样就可以判断一个给定三角形是顺时针还是逆时针了。
(如果这里你发现计算出r=0,那么说明ABC三点共线,即给定点在多边形的边上,可以直接返回)
判断一个多边形的凹凸性。
利用上述判断三角形是顺时针还是逆时针的方法来辅助判断一个多边形的凹凸性。
对于一个给定的多边形,按照逆时针方向遍历该多边形的所有顶点,并放入一个首尾相连的循环链表中。然后从这个循环链表中每次取出相邻三个顶点,判断这个三个顶点构成的三角形是顺时针三角形还是逆时针三角形,如果是逆时针,则说明该三角形三个顶点中位于中间的顶点是凸点;如果是顺时针,则说明位于中间的顶点是凹点。
例如:假设取出的三个顶点是A、B、C,如果三角形ABC是逆时针三角形,则说明顶点B(即位于中间的顶点)是凸点,否则是凹点。然后可以取出D点,通过三角形BCD判断C点的凹凸性,同理D点,E点...最后也可以判断出A点的凹凸性。(通过由最后一个顶点,A点,B点按顺序构成的三角形来判断A点的凹凸性)。如果该多边形所有的顶点经过判断都是凸点,则说明该多边形是凸多边形,否则就是凹多边形。
对于上述示例用图,多边形ABCDEFGH中,点A,B,E,F,H是凸点,点C,D,G是凹点。由于并不是所有的顶点都是凸点,所以多边形ABCDEFGH是凹多边形。
补边
利用上述对给定多边形的每一个顶点的凹凸性的判断来进行补边操作。
补边算法:
1.从存储多边形顶点的循环链表中,找到一个凸点(一定存在这个凸点,即不可能所有顶点都是凹点)
2.从这个顶点开始往后遍历顶点,当遇到的第一个凹点时标记紧邻这个凹点的前一个凸点,因为这个凸点就是所需要补的边的一个顶点,然后继续往后遍历,如果还是凹点,跳过继续遍历,直至找到第一个凸点,那么这个凸点就是所需要补的边的另一个顶点。这样就找出了所需要补的边的两个顶点,就可以确定需要补的一条边了。
3.从找到的凸点开始,重复上述第2步操作。直至回到最开始找到的凸点,则算法结束。这样就可以找到所有需要补的边了。
可以发现,每一条补边,起点和终点都是凸点,中间经过的顶点都是凹点。
上述示例用图中,对于补边BE,顶点B和E都是凸点,而它们中间的顶点C和D则都是凹点。对于补边FH,顶点F和H都是凸点,而它们中间的顶点G则是凹点。
构造凸多边形
利用上述补边来构造凸多边形。
算法如下:
1.对于找到每一条补边,起点和终点都知道,就可以从多边形顶点的循环链表中取出这两个顶点中间的所有的顶点,而这些顶点加上起点和终点就构成了一个外在凸多边形(即不属于原始多边形的多边形)。
示例中,外在凸多边形有凸多边形BCDE和凸多边形FGH。
2.在原始多边形顶点的循环链表中把所有的凹点都去除,只留下凸点。那么这些凸点即构成了原始多边形经补边之后构造的大凸多边形了。
示例中,去除所有凹点C,D,G,则剩下的顶点A,B,E,F,G构成了补边之后的大凸多边形ABEFH
经过上面的所有分析,就可以轻松判断任意一个点是否在一个给定多边形的内部了。
4. 判断点与多边形位置关系vc++/c
不知道你指的关系是什么,下面就提供一个判断点是否在多边形内的算法:
// 功能:判断点是否在多边形内
// 方法:求解通过该点的水平线与多边形各边的交点
// 结论:单边交点为奇数,成立!
//参数:
// POINT p 指定的某个点
// LPPOINT ptPolygon 多边形的各个顶点坐标(首末点可以不一致)
// int nCount 多边形定点的个数
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);
}
以上代码放心用吧,本人已经用它十多年了。
另:=======================================
LPPONT 就是POINT*,即POINT数组,里面存放多边形的顶点坐标。
函数原型也可以写做:
BOOL PtInPolygon (POINT p, POINT* ptPolygon, int nCount);
例如:
//十个顶点的多边形
POINT* points = new POINT[10];
points[0].x = ...;
points[0].y = ...;
points[1].x = ...;
points[1].y = ...;
//...
//测试用点
POINT ptTest;
ptTest.x = ...;
ptTest.y = ...;
//判断ptTest是否在多边形points内
if(PtInPolygon(ptTest, points, 10))
{
//...
}
else
{
//...
}
delete points;//释放内存
以上算法已经是最经典、最简单的了,完全可靠的,我都用了十多年了,很多系统软件中都用的是它。
5. 如何判断一个点是否在一个多边形中
就如同走路一般地划线,从数组的第一个点连到第五个点,多边行就构造出来了.
在图形编程中,坐标的利用是不可忽视的.在这里判断一个点是否在多边行内部(可以包括线上)就要利用到各个点的坐标关系.下面开始讨论具体的方法.
对任何事物的分析,我们应该遵守由简入繁的原则,这样才能提高条理性,少犯错误.我们先判断一个点是否在一个三角形内部.一个三角形在一个坐标系(譬如由A、B、C三点组成)中,我们可以通过计算它的有向面积来判断A、B、C三点在坐标系中的顺逆.当然,在此之前我们必须先订立一套计算面积的规则.比如,在笛卡尔坐标系中,我们利用:
S=((A.x-B.x)*(A.y+B.y)+(B.x-C.x)*(B.y+C.y)+(C.x-A.x)*(C.y+B.y))/2
----------------------------------
对于凸多边形而言(以三角形ABC为例),假设存在一个点D,若这个点在三角形的内部,则以该点为起点,和原多边形的任意两个连续的且尊照多边形组成方向
的点(如DAB、DBC、DCA)组成的三角形讲都是一个方向,如DAB和DBC都是顺时针方向.若这个点在三角形的外部,则会出现DAB、DBC、DCA三个三角形方向不一致的情形,即其中有一个不同于另外两个(如一个顺,两个逆).到这里我们就知道了如何判断一个点在一个三角形内部的算法,总结一下就是通过判断该点同三角形连续两点组成三角形的顺逆性(归于面积的正负)来得到结果的.
实际上,对于其他的凸多边性也可以用一样的方法,只是这个时候判断的三角形的数目增加了,不管怎么样,只要点在多边形内部他们的顺逆都是一样的.对于凹多边形而言,情况就要相对复杂一些了.此时,判断一个点是否在其内部的计算量会增加比较多.具体算法如下:此时三角形一个个的判断可能会失效,我们应当两个同时判断.即判断该点是否同时在多边形的连续两个三角形之中,相当于是求两个三角形的交集,直到完成多边形封闭.例如,判断P点是否在多边形ABCD之中,依次判断P是否在ABC-BCD、BCD-CDA、CDA-DAB、DAB-ABC各个成对三角形中,P在ABC-BCD中表示P在ABC-BCD的交集之中.这样就可以判断一个点是否在一个凹多边形内部了.
以上说的仅仅是简单多边形而已,在复杂多变形之中(如内洞、飞地等),还要通过多边形的拓扑运算来得到结果.另外,在凸边形中,还可以进行优化:可以以一个点为中心,分裂多边形为最少个数的三角形,从而得到改进.
6. 求多边形内一点的算法
随便一点么?
这还不简单...
你随便找两个不相邻的顶点,比如a1和a3
然后a1a3上面的任意一点都在多边形内啊
为了方便你可意取中点。
比如((x3-x1)/2,(y3-y1)/2)这一点不是一定在多边形内么
______________________________________________________
是凸多边形的话可以写凸包.
如果你懒得写凸包
可以直接连接a1a2的中点m1和a1a3的中点m2,然后m1m2的中点是一定在多边形内的。
7. C++ 中检测某点是否在某个多边形内的算法
用图形学方法 奇偶规则
从任意位置P到对象坐标范围以外的远点画一条概念上的射线,并统计沿该射线与各边交点的个数。根据奇偶性判断P在内还是外
8. 急求大神详细解释一下代码!!!——vb判断点在多边形内
别等解释了,先去恶补一下判断点在多边形内的算法吧。如转角法、射线法、改进的弧长法等。看这个语句属于什么算法,或者你结合这个程序的其他语句来解释下就很容易明了,无非就是几个循环与判断。
9. 如何判定一个点是否在多边形的内部及算法
假设多边形的坐标存放在一个数组里,首先我们需要取得该数组在横坐标和纵坐标的最大值和最小值,根据这四个点算出一个四边型,首先判断目标坐标点是否在这个四边型之内,如果在这个四边型之外,那可以跳过后面较为复杂的计算,直接返回false。
if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) {
// 这个测试都过不了。。。直接返回false;
接下来是核心算法部分:
int pnpoly (int nvert, float *vertx, float *verty, float testx, float testy) {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; }return c;}
首先,参数nvert 代表多边形有几个点。浮点数testx, testy代表待测试点的横坐标和纵坐标,*vertx,*verty分别指向储存多边形横纵坐标数组的首地址。
我们注意到,每次计算都涉及到相邻的两个点和待测试点,然后考虑两个问题:
被测试点的纵坐标testy是否在本次循环所测试的两个相邻点纵坐标范围之内?即verty[i]<testy < verty[j]
或者verty[j] <testy < verty[i]
2. 待测点test是否在i,j两点之间的连线之下?看不懂后半短if statement的朋友请自行在纸上写下i,j两点间的斜率公式,要用到一点初中解析几何和不等式的知识范畴,对广大码农来说小菜一碟。
10. 几何题,多边形算法
左边的图形,条件不足 ,无法确定红线上方直角三角形内锐角的度数,因而无法计算红色线处的长度,若锐角为45º,则非常简单,如图,点击放大: