【问题标题】:Diagonal of polygon is inside or outside?多边形的对角线在里面还是外面?
【发布时间】:2011-02-18 11:35:25
【问题描述】:

我有三个连续的多边形点,比如 p1、p2、p3。现在我想知道 p1 和 p3 之间的正交是在多边形内部还是在多边形外部。

我通过采用三个向量 v1、v2 和 v3 来做到这一点。而多边形中点p1之前的点说p0。
v1 = (p0 - p1)
v2 = (p2 - p1)
v3 = (p3 - p1)

关于this问题,我使用的是该问题的已接受答案中显示的方法。它仅适用于逆时针。如果我的点是顺时针的怎么办。

我也知道我的整个多边形是顺时针还是逆时针。因此,我选择了向量 v1 和 v2。但我仍然遇到一些问题。我正在展示一个我遇到问题的案例。

这个多边形是逆时针的。并且是从v1和v2的起源开始的。

【问题讨论】:

  • 您对积分的选择非常混乱。它们不是围绕多边形按顺序排列的,v1 的公式与 v2 和 v3 不匹配。我指出这些并不是为了抱怨;这可能是您的问题所在。
  • “p1 和 p3 之间的正交”是什么意思?您是指 p1 和 p3 的对角线(如图所示)?
  • 我的意思是 p1 和 p3 之间的线段。这些不是我选择的要点。经过一些处理,我得到了它们。并且 v1、v2 和 v3 正确显示。
  • @Michael 是的,我的意思是 p1 和 p3 的对角线

标签: algorithm math polygon


【解决方案1】:

由于您的点是连续的,您可以通过检查三角形 p1 p2 p3 的方向来解决这个问题。如果方向与多边形的方向相同,则对角线在内部,否则在外部。

要确定三角形的方向,最简单的方法是计算符号面积并检查符号。计算

p1.x * p2.y + p2.x * p3.y + p3.x * p1.y - p2.x * p1.y - p3.x * p2.y - p1.x * p3.y

如果该值的符号为正,则方向为逆时针方向。如果符号为负,则方向为顺时针。

确切地说,上述方法只为您提供对角线位于多边形哪一侧的信息。显然,多边形仍然可以在后面的点与对角线相交。

【讨论】:

  • cgafaq.info/wiki/Polygon_Area 显示的方程式与您的方程式不同。
  • 其实公式基本一样。我上面给出的版本是三点并忽略常量的版本(因为我们只对符号感兴趣)。
  • 我没有使用您显示的确切方法。但是我从这个答案中得到了提示。谢谢。
【解决方案2】:

基本上,对角线可以完全在内部、完全在外部、内部和外部,并且在所有三种情况下都可能重叠一条或多条边。这使得确定您需要什么变得不那么容易了。

从数学的角度来看,里面和外面其实并没有太大的区别,除了外面有无限面积这样的小细节。 (至少对于 2D 平面;在球体上,多边形的内部和外部没有明显区别。)

您还有一个关于多边形边缘排序的子问题。最简单的方法是按顺序对相邻边之间的所有角度求和。这将加起来为 N*(pi/2)。对于逆时针多边形,N 为正数。

[编辑] 一旦你知道了方向,如果你没有上面列出的困难案例,问题就很简单了。角度 p0-p1-p2 小于角度 p0-p1-p3。因此,边 p1-p3 至少部分位于多边形之外。如果它没有越过其他边,它显然完全位于多边形之外。

【讨论】:

  • 是的,这是我的问题,里面和外面没有太大区别。我想访问内部部分,但在某些情况下它给了我错误的结果。请帮我。解决了边缘排序问题。谢谢。
  • ohhhhhhhh 但我遇到了上面显示的困难案例。这是一个小例子。我可以得到更难的情况..
  • 要解决更困难的情况,请确定您的“对角线”p1-p3 是否跨越任何边缘。检测线段交叉的算法很容易找到,例如local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d.
  • 是的,我已经做到了,但唯一的问题是对角线完全在多边形之外。
【解决方案3】:

任意两个向量之间的夹角为

alpha = acos(v1.x * v2.x + v1.y * v2.y)

因为你现在可以拥有之间的角度

v1 and v3 = alpha1; v1 and v2 = alpha2; 

您可以检查 alpha2 是否在 alpha1 内:

function normalize(a):
    if a > 2 * pi then a - 2 * pi
    else if a < 2 * pi then a + 2 * pi
    else a

alpha1 = normalize(alpha1)
alpha2 = normalize(alpha2)

if (alpha2 < alpha1) then is_between
else is_not_between

这不是很完整,但你应该明白了。

编辑:如果多边形如 MSalters 所指出的那样重叠,它将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多