确定多边形顶点之间的线段是否为“内部”多边形

问题描述

我试图找到一种有效的算法,可以检查简单(编辑:简单凹面)多边形中两个顶点之间的线是否包含位于多边形域之外的点。我能找到的最接近的问题是:https://stackoverflow.com/a/36378838/12135804

但我不确定答案是否完全正确。可能是这样,在这种情况下,如果有人能澄清那就太好了。

基本思想如下图所示:

enter image description here

我希望红线失败而绿线成功的地方。我知道人们不能天真地测试中点,因为这在任何情况下都不起作用,但是在多边形域外的线上找到任何点都应该取消它的资格。

我感谢所有帮助!

编辑:忘记包含数学堆栈交换的交叉链接: https://math.stackexchange.com/q/4040059/892519

解决方法

让我们假设最高点是 A,其他点被命名为 BC ...逆时针,所以我们知道我们在说什么。

>

如果取红色线段 B-D,中间的一点在左边。如果你拿绿色线段 D-F,中间的一点就在右边。现在,更有趣的部分是 B-E,其中 C 位于左侧,而 D 位于右侧。

为了确定左右,使用向量积。长度取决于 sin 函数,因此如果您得到的值小于零,则为一侧,大于零的为另一侧。

,

经过很多的谷歌搜索,我终于找到了大约 12 年前一个 stackoverflow 问题的答案:https://stackoverflow.com/a/693877/12135804

假设多边形中的边遵循特定顺序,可以使用线的起点 (p)、多边形中从该起点开始的下一个 ccw 点作为拐点 (q) 来创建简单的 ccw 测试,以及线的端点 (r)。对于红线 BD,测试将检查 B、C、D 是否为 ccw(不是)。对于绿线 DF,测试 D、E、F 是否为 ccw(它是!)。即使这些点是非连续的,这也会起作用。但是,当红绿线的顺序颠倒时,这将失败。例如,如果红线变为 DB,则测试将检查 D、E、B,这将通过 ccw 测试。

我认为更可靠的解决方案是在凹多边形中搜索共享要测试线端点的两条边。对于两对,计算两条边与 x 轴之间的角度。还要计算直线与 x 轴的角度。如果该线在多边形内,则该线的角度应介于两个端点的多边形边角度的最大值和最小值之间。

我认为是测试钝角还是锐角取决于一些因素。红线在 B 处的角度 w.r.t.到 x 轴将在 ABBC 之间的钝角范围内,在点 C 处也是如此。从视觉上看,很明显,锐界是两个点的最大/最小测试需要使用的。如果可以从逻辑上选择计算边界的基线,那么就可以完成。

当然,如果线在两个端点之间的途中穿过多边形外部,这将不起作用,但这确实处理了正常线-多边形相交测试的退化情况。假设它适用于所有退化情况,即。

我不会将此标记为答案,因为我无法证明。

编辑:嗯,我再次考虑这个问题并决定搜索与我上面提出的角度边界类似的问题,并找到了这个:https://stackoverflow.com/a/17497339/12135804

这个答案满足不知道线条的方向!但是,它假定应该测试 AB 之间的最小界限。当 AxB A 和 B 共享的顶点的线如果指向外部将返回 true多边形,如果它在里面,则相反。不过,我认为根据 AxB 的符号翻转结果应该足以说明这一点。 (在此相关答案中验证的预感:https://stackoverflow.com/a/43384516/12135804

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...