2

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

但我不确定答案是否完全正确。可能是,在这种情况下,如果有人可以澄清那将是很好的。

基本思想如下图所示: 在此处输入图像描述

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

我感谢任何和所有的帮助!

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

4

2 回答 2

0

经过大量的谷歌搜索,我终于找到了大约 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 轴的角度。如果线在多边形内,则线的角度应位于两个端点的多边形边角的最大值和最小值之间。

我认为,是否测试角度的钝角或锐角取决于一些因素。红线在 wrt 与 x 轴的角度将在和B之间的钝角范围内,在点 也是如此。从视觉上看,很明显锐界是两个点的最大/最小测试需要使用的。如果可以从逻辑上选择计算边界的基线,则可以完成。ABBCC

当然,如果线在两个端点之间的途中越过多边形外部,这将不起作用,但这确实可以处理正常线-多边形相交测试的退化情况。假设它在每个退化的情况下都有效,也就是说。

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

编辑:好吧,我又回来考虑这个问题,并决定搜索类似于我上面提出的角度边界的问题,并找到了这个:https ://stackoverflow.com/a/17497339/12135804

这个答案满足不知道线的方向!A但是,它假设和B应该测试之间的最小界限。这不适用于凹顶点,当AxBis < 0 时。在这种情况下,连接到顶点的线由线共享,如果它指向多边形外部AB则返回 true,反之,如果它在内部,则返回 false。不过,我认为根据 的符号翻转结果AxB应该足以说明这一点。(在此相关答案中验证的预感:https ://stackoverflow.com/a/43384516/12135804 )

于 2021-02-27T20:17:57.577 回答
0

让我们假设最上面的点是,其他点是逆时针A命名的B,所以我们知道我们在说什么。C

如果您选择红色部分B-D,则中间的一点在左侧。如果您选择绿色部分D-F,则中间的一点在右侧。现在,一个更有趣的部分是,左边是B-E哪里,右边是。CD

为了确定左右,使用向量积。长度取决于sin函数,所以如果你得到一个小于零的值,它是一侧,大于零是另一侧。

于 2021-02-25T18:45:49.460 回答