5

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

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

来自巴西的感谢。

4

6 回答 6

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)and 与 and相同y(n)(关闭多边形)。x(0)y(0)

如果它是正的,那么顶点是逆时针排列的,否则是顺时针排列的。

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

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

抱歉,第一种方法令人费解。

于 2009-02-03T17:59:00.057 回答
2
  1. 找到顶点的凸包
  2. 识别位于凸包上的顶点。这些是具有 >180 个外角的候选顶点。
  3. 对于每个这样的顶点,进一步研究角度(现在想不出任何方法,但你可以扩展它)。
于 2009-02-03T17:22:41.597 回答
0

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

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

例如,

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

然后将角度相加。

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

于 2009-02-03T17:02:59.203 回答
0

切线的问题是当 x==0 时。如果您只知道多边形的顶点,那么除非它是一个三角形,否则您所知道的还不够,因为它们可能具有任何类型的连通性。

假设您知道连通性,那么您将需要计算缠绕顺序(即,点在多边形周围的哪个方向?)。使用缠绕顺序,您可以获取每个点与其相邻点的叉积,并取其幅度的反正弦以获得角度。

于 2009-02-03T17:31:30.067 回答
0

求最后两个向量的内角(作为例子),我们需要对多边形的最后两个向量实现这个方程:

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

这是使用向量的点积。如果您对此有疑问,这里有一个教程

但这并没有考虑到“缠绕方向”,首先你必须得到叉积,如果叉积是正的,那就是左转,如果是负的——右转(我们将通过减去(ext) 360 度角。

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

:D

于 2012-09-18T07:49:57.127 回答
-1

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

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

使用三个相邻的顶点,想象一个三角形,它们会找到内角。

例如,看多边形:

多边形

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

构建内部三角形

于 2009-02-03T16:59:56.933 回答