如何找到多边形的内角数,大于 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)
and 与 and相同y(n)
(关闭多边形)。x(0)
y(0)
如果它是正的,那么顶点是逆时针排列的,否则是顺时针排列的。
编辑:当您简化旋转和标量积的步骤时,您会得到二维叉积的公式x1*y2 - x2*y1
。这简化了上面的第一步:
((x1 * y2) - (x2 * y1))
抱歉,第一种方法令人费解。
我假设这是一个不规则多边形,因为规则多边形的内角很难大于 180 度。
对于每个顶点,您还需要知道两个相邻顶点。然后,您可以将其转换为三角问题,在其中找到从主顶点到左顶点的角度,并将其添加到从主顶点到右顶点的角度。
例如,
tan(angle_to_left) = (vy-left.x)/(vy-left.y) tan(angle_to_right) = (vy-right.x)/(vy-right.y)
然后将角度相加。
最后,对于大于 180 的所有角度,增加一个计数器。在遍历所有顶点后,您的计数器会告诉您有多少个内角大于 180。
切线的问题是当 x==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
这是一个与几何有关的问题,与编程不完全相关。
如果你有顶点,你可以通过三角函数找到内角,类似于你如何找到三角形的角度。
使用三个相邻的顶点,想象一个三角形,它们会找到内角。
例如,看多边形:
我们可以构造一个三角形: