找出多边形的内角数,大于180º

时间:2009-02-03 16:51:09

标签: algorithm geometry polygon

如何找到大于180º的多边形内角数, 只有多边形的顶点?

对于每个顶点,我总是想要内部角度,而不是外部角度。

感谢巴西。

6 个答案:

答案 0 :(得分:4)

您可以通过采用标量积(点积)来确定两个向量的角度。一个有用的特性是,如果向量是正交的,它们的标量积为零;如果它们的角度是钝的,则产品为负,否则为正。因此,要采取的步骤是:

  • 找到从V0到V1的第一条边(作为矢量,通过减去坐标得到这个),然后向左旋转90度(这只是将(x y)转换为(-y x)
  • 找到从V1到V2的第二条边(未旋转)
  • 采用标量积(这只是(x1 * x2) + (y1 * y2)
  • 如果标量积为负,则为右转,否则为左转
  • 下一个边缘......
  • 如果你逆时针穿过顶点,计算右转数,否则左转数
  • 对于最后一个顶点,你必须返回第一个顶点(即使用边Vn到V0和V0到V1)

编辑:您可以通过使用以下公式计算多边形的区域来查找顶点是逆时针还是顺时针排序:

     1  n-1
A = --- SUM( x(i)*y(i+1) - x(i+1)*y(i) )
     2  i=0

其中n是顶点数。 x(n)y(n)x(0)y(0)相同(关闭多边形)。

如果是正数,则顶点按逆时针顺序排列,否则顺时针排列。

编辑:当您简化旋转和标量产品的步骤时,您会得到二维交叉产品x1*y2 - x2*y1的公式。这简化了上面的第一步:

  • 找到从V0到V1的第一条边(作为矢量,通过减去坐标)
  • dito从V1到V2的第二个边缘
  • 选择交叉产品((x1 * y2) - (x2 * y1))
  • 如果叉积为正,则为左转

对于复杂的第一种方法感到抱歉。

答案 1 :(得分:2)

  1. 找到顶点的convex hull
  2. 识别位于凸包上的顶点。这些是您的候选顶点,具有> 180个外角。
  3. 对于每个这样的顶点进一步研究角度(现在不能想到任何方式,但你可以扩展它)。

答案 2 :(得分:0)

我假设这是一个不规则的多边形,因为正多边形的内角大于180度是非常困难的。

对于每个顶点,您还需要知道两个相邻顶点。然后,您可以将其转换为三角函数问题,在此问题中,您可以找到从主顶点到左顶点的角度,并将其添加到从主顶点到右顶点的角度。

例如,

tan(angle_to_left) = (v.y-left.x)/(v.y-left.y)
tan(angle_to_right) = (v.y-right.x)/(v.y-right.y)

然后将角度加在一起。

最后,对于大于180的所有角度,增加计数器。在遍历所有顶点后,您的计数器将告诉您有多少内角大于180。

答案 3 :(得分:0)

切线问题是x == 0时。如果您只知道多边形的顶点,除非它是三角形,否则您不了解它,因为它们可以具有任何类型的连接。

假设你知道连通性,那么你需要计算绕线顺序(即,点在多边形周围的方向?)。通过绕线顺序,您可以获取每个点与其相邻点的交叉乘积,并采用相反的正弦值来获得该角度。

答案 4 :(得分:0)

找到最后两个向量的内角(作为一个例子),我们需要为多边形的最后两个向量实现这个等式:

angleRadians = Math.acos((vx1 * vx2 + vy1 * vy2)/(Math.sqrt(vx1 * vx1 + vy1 * vy1)* Math.sqrt(vx2 * vx2 + vy2 * vy2)));

这是使用载体的Dot产品。如果您对此有疑问,here's a tutorial

但是这并没有考虑到'绕线方向',首先你必须得到交叉产品,如果交叉产品为正,那么它是左转,如果是负的 - 右转(我们将通过从360减去(ext)角度来补偿。

我在这里包含了我的JS代码,作为要点:https://gist.github.com/3741816

:d

答案 5 :(得分:-1)

这是一个与几何有关的问题,而不是与编程相关的问题。

如果你有顶点,你可以通过三角函数找到内角,类似于你找到三角形的角度。

使用三个相邻的顶点,想象一个三角形,然后找到内角。

例如,查看多边形:

Polygon

我们可以构建一个三角形:

Construct internal triangle