查找一个内角大于180度的多边形的内角数量

6

如何找到一个多边形的内角数,且该多边形的内角大于180度,只给出该多边形的顶点?

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

来自巴西的感谢。


你不能仅凭顶点来定义一个多边形,必须同时指定其边数。 - Frederick The Fool
我已经有了顶点的顺序,所以不需要边。 - lucasbls1
顶点定义了要连接的两个点(边),以形成多边形。 - Swinders
哈哈,好的。你让我想起了在校园里上数学课的时候。 - Julius A
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)y(n)x(0)y(0)相同(以关闭多边形)。

如果结果为正,则顶点按逆时针排序,否则按顺时针排序。

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

  • 找到从V0到V1的第一条边(作为向量,通过减去坐标获得)
  • 找到从V1到V2的第二条边(未旋转)
  • 进行叉积运算((x1 * y2) - (x2 * y1))
  • 如果叉积为正,则是左转

非常抱歉第一种方法过于复杂。


你能定义一下标量积吗? - David Norman
可能是点积。使用叉积要容易得多,因为假设您知道绕组,那么它就被定义明确了。 - MSN
标量积:x1 * x2 + y1 * y2 = 标量 - Mike Burton
其中,x#和y#代表与向量#相关联的x和y位移,即并不是端点的坐标。 - Mike Burton
“probably”?这里没有歧义。我没有意识到在英语中,“scalar product”是较少使用的名称,但我能够在谷歌上找到的每个数学网站都说:“点积,也称为标量积或内积...”。在文本中添加了提示。 - Svante
显示剩余6条评论

2
  1. 找到顶点的凸包
  2. 确定不在凸包上的顶点。这些是具有大于180度外角的候选顶点。
  3. 对于每个这样的顶点,进一步调查其角度(目前想不到任何方法,但您可以扩展此内容)。

对于凸包中排除的单个顶点,其内角大于180度。对于一系列顶点,递归地研究由排除的顶点和系列两端包含的顶点形成的多边形的凸包。 - user57368
这个答案完全颠倒了——在找到简单多边形的凸包的最有效方法中,涉及到找到凹内角。 - Svante

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。


0

正切的问题在于当x等于零时。如果你只知道多边形的顶点,除非它是三角形,否则你不知道足够的信息,因为它们可以有任何类型的连接。

假设您知道连接方式,那么您需要计算绕多边形旋转的方向(即点的方向顺序是什么?)。通过绕序,您可以将每个点与其相邻点进行叉积运算,并取该值的大小的反正弦值以获得角度。


0

要找出最后两个向量的内角(以此为例),我们需要对多边形的最后两个向量实施以下方程:

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

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

但这并没有考虑“绕组方向”,首先必须获得叉积,如果叉积为正,则是向左转,如果为负,则是向右转(我们将从 360 中减去(ext)角度以进行补偿)。

我在这里附上了我的 JS 代码,作为gist:https://gist.github.com/3741816

:D


-1
这是一个与几何有关的问题,不完全涉及编程。
如果你已经有了顶点,就可以通过三角函数来计算内部角度,类似于计算三角形的角度。
使用三个相邻的顶点,想象一个三角形并计算其内部角度。
例如,看一下多边形:

Polygon

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

Construct internal triangle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接