Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 如何确定对角线在凹多边形内或凹多边形外?_Geometry_Polygon - Fatal编程技术网

Geometry 如何确定对角线在凹多边形内或凹多边形外?

Geometry 如何确定对角线在凹多边形内或凹多边形外?,geometry,polygon,Geometry,Polygon,凹(非凸)多边形的对角线(对角线是连接非相邻顶点的线段)可以完全位于多边形内部或外部(或与多边形的边相交)。如何确定它是否完全位于多边形中?(多边形中无点测试的方法) 如何确定它是否完全在多边形中 如果要确定对角线是否从未离开多边形的边界,只需确定它是否与两个相邻顶点之间的任何直线相交即可 如果是,则部分位于多边形内,部分位于多边形外 如果不是,它要么完全在多边形内,要么完全在多边形外。从这里开始,最简单的方法是在对角线上的任意点上使用多边形中的点,但如果不想这样做,请使用 约翰的回答恰到好处

凹(非凸)多边形的对角线(对角线是连接非相邻顶点的线段)可以完全位于多边形内部或外部(或与多边形的边相交)。如何确定它是否完全位于多边形中?(多边形中无点测试的方法

如何确定它是否完全在多边形中

如果要确定对角线是否从未离开多边形的边界,只需确定它是否与两个相邻顶点之间的任何直线相交即可

  • 如果是,则部分位于多边形内,部分位于多边形外

  • 如果不是,它要么完全在多边形内,要么完全在多边形外。从这里开始,最简单的方法是在对角线上的任意点上使用多边形中的点,但如果不想这样做,请使用


约翰的回答恰到好处:

如果要确定对角线是否从未离开多边形的边界,只需确定它是否与两个相邻顶点之间的任何直线相交即可。如果是这样的话,它将离开多边形


执行此检查的有效方法是对数据运行Bentley Ottman sweepline算法。它易于实现,但很难使数值稳定。如果你有少于。。。说。。。多边形中的20条边蛮力搜索很可能会更快。

我相信John的回答忽略了一个重要的例子:当对角线从一开始就完全位于多边形之外时。想象一下,把对角的“桥”做成他的“u”形多边形的两座塔

我几年前就已经解决了这个问题,所以如果我的记忆有点模糊,请原谅

我解决这个问题的方法是对多边形中的每条边执行对角线的线交点测试。然后有两种可能的情况:要么至少有一个十字路口,要么没有十字路口。如果得到任何交点,则对角线不在多边形内

如果没有任何交点,则需要确定对角线是完全位于多边形内部还是完全位于多边形外部。假设对角线连接p[i]到p[j],i


完成此操作后,如果对角线位于多边形外部,则对角线的2D角度为正;如果对角线位于多边形内部,则对角线的2D角度为负。

如果对角线与边至少有一个交点,则对角线部分位于多边形内部,部分位于多边形外部,但如果对角线与边没有交点,只有两种状态:完全在多边形内或完全在多边形外

要确定它是在多边形内还是在多边形外,请执行以下操作:

假设多边形的顶点按逆时针方向排序。考虑位于顶点的对角线的一个端点,称为P[i](另一个端点是P[j])。然后,制作三个向量,其第一个点为p[i]:

V1:p[i+1]-p[i]

V2:p[i-1]-p[i]

V3:p[j]-p[i]

当且仅当V3在V1和V2之间,当我们从V1到V2逆时针移动时,对角线完全在多边形中

当我们逆时针从V1到V2时,如何确定V3是否在V1和V2之间?去


我已经用这种方法编写了一个程序,它非常有效。

关于检查线段之间的交点(这是您可能必须执行的第一步),我发现上面的解释很有帮助。您必须检查对角线和多边形的任何边之间的交点。如果您使用的是MATLAB,您应该能够找到一种有效的方法,使用矩阵和向量运算同时检查所有边的交点(我已经用这种方法处理了计算交点)。

我知道这个问题多年前就得到了回答,但我有一种易于实现的新方法

正如前面的答案中所建议的,如果多边形的任何边与对角线线段相交,则应首先计算多边形的所有边。描述了计算交点并确定交点是否存在的代码

如果所有边(不包括与对角线共享顶点的边)都没有与对角线相交,则您知道对角线要么完全在多边形内部,要么完全在多边形外部,这意味着对角线的中点也分别完全在多边形内部或外部。中点是对角线的两个端点的平均值

现在,我们将问题转化为计算对角线是在多边形内部还是外部,以及中点是在多边形内部还是外部。使用单点比使用直线更容易

描述了确定点是否位于多边形内的方法,可以通过计算从该点开始的水平光线的相交量并查看该光线相交的多边形边数来总结。如果光线相交奇数次,则该点位于多边形内部,否则位于多边形外部


此实现易于实现的原因是,当您迭代所有边以检查与对角线的交点时,您现在还可以计算对角线中点的光线是否与正在处理的当前边相交。如果for循环返回时对角线和边之间没有交点,则可以查看偶数/奇数计数,以确定对角线是在内侧还是外侧。

我在处理地理空间应用程序的编程时遇到过类似问题。。。似乎