如何找到一个多边形的内角数,且该多边形的内角大于180度,只给出该多边形的顶点?
对于每个顶点,我想要的是内角而不是外角。
来自巴西的感谢。
(x y)
转换为(-y x)
)(x1 * x2)+(y1 * y2)
)编辑:您可以使用以下公式计算多边形的面积来确定顶点是否按逆时针或顺时针排序:
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
。这简化了上面的第一步:
((x1 * y2) - (x2 * y1))
非常抱歉第一种方法过于复杂。
我假设这是一个不规则多边形,因为一个正规多边形内角大于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。
正切的问题在于当x等于零时。如果你只知道多边形的顶点,除非它是三角形,否则你不知道足够的信息,因为它们可以有任何类型的连接。
假设您知道连接方式,那么您需要计算绕多边形旋转的方向(即点的方向顺序是什么?)。通过绕序,您可以将每个点与其相邻点进行叉积运算,并取该值的大小的反正弦值以获得角度。
要找出最后两个向量的内角(以此为例),我们需要对多边形的最后两个向量实施以下方程:
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
我们可以构建一个三角形: