Algorithm 求一个多边形的内角数,大于180º;
我如何找到一个多边形的内角数,大于180º, 只有多边形的顶点吗 对于每个顶点,我希望始终是内部角度,而不是外部角度Algorithm 求一个多边形的内角数,大于180º;,algorithm,geometry,polygon,Algorithm,Geometry,Polygon,我如何找到一个多边形的内角数,大于180º, 只有多边形的顶点吗 对于每个顶点,我希望始终是内部角度,而不是外部角度 感谢巴西。这是一个与几何有关的问题,与编程无关 如果你有顶点,你可以通过三角法找到内角,就像你找到三角形的角度一样 使用三个相邻顶点,想象一个三角形,然后它们找到内角 例如,查看多边形: 我们可以将三角形构造为: 我假设这是一个不规则多边形,因为正多边形的内角很难大于180度 对于每个顶点,还需要知道两个相邻顶点。然后可以将其转化为一个三角问题,在这里可以找到从主顶点到(比如)
感谢巴西。这是一个与几何有关的问题,与编程无关 如果你有顶点,你可以通过三角法找到内角,就像你找到三角形的角度一样 使用三个相邻顶点,想象一个三角形,然后它们找到内角 例如,查看多边形: 我们可以将三角形构造为:
我假设这是一个不规则多边形,因为正多边形的内角很难大于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) tan(从左到左的角度)=(v.y-left.x)/(v.y-left.y) tan(从右到右的角度)=(v.y-right.x)/(v.y-right.y) 然后把角度加在一起 最后,对于大于180的所有角度,增加一个计数器。遍历所有顶点后,计数器将告诉您有多少个内角大于180
切线的问题是当x==0时。如果你只知道多边形的顶点,除非它是三角形,否则你知道的还不够多,因为它们可以有任何形式的连通性
假设知道连接性,则需要计算缠绕顺序(即,点围绕多边形的方向?)。根据缠绕顺序,可以取每个点与其相邻点的叉积,并取其大小的反正弦值以获得角度。只需取标量积(点积),即可确定两个向量的角度。一个有用的性质是,如果向量是正交的,那么它们的标量积为零;如果它们的角度是钝角,则乘积为负,否则为正。因此,应采取的步骤是:
- 找到从V0到V1的第一条边(作为向量,通过减去坐标得到),然后向左旋转90度(这只是将
转换为(xy)
)(-yx)
- 找到从V1到V2的第二条边(未旋转)
- 以标量积为例(这只是
)(x1*x2)+(y1*y2)
- 如果标量积为负,则为右转,否则为左转
- 下一个边缘
- 如果逆时针穿过顶点,请计算右转弯的次数,否则计算左转弯的次数
- 对于最后一个顶点,必须返回到第一个顶点(即使用边Vn到V0和V0到V1)
n
是顶点数x(n)
和y(n)
与x(0)
和y(0)
相同(用于闭合多边形)
如果为正,则顶点按逆时针顺序排列,否则按顺时针顺序排列
编辑:当简化旋转和标量积的步骤时,就得到了二维叉积的公式,x1*y2-x2*y1
。这简化了上述第一步:
- 找到从V0到V1的第一条边(作为向量,减去坐标)
- 从V1到V2的第二条边的dito
- 取叉积
((x1*y2)-(x2*y1))
- 如果叉积为正,则为左转
对不起,第一种方法很复杂。找到最后两个向量的内角(作为示例),我们需要为多边形的最后两个向量实现以下等式: 角度弧度=Math.acos((vx1*vx2+vy1*vy2)/(Math.sqrt(vx1*vx1+vy1*vy1)*Math.sqrt(vx2*vx2+vy2*vy2)) 这是使用向量的点积。如果你对此有疑问 但这并没有考虑到“缠绕方向”,首先你必须得到叉积,如果叉积为正,则为左转,如果为负,则为右转(我们将通过从360减去(ext)角度来补偿) 我在这里包括了我的JS代码,作为要点:
:D不能仅通过顶点定义多边形。还必须指定边。我有有序的顶点,因此不需要边。顶点定义要连接的点(边)为了给出多边形。哈哈。好的。你提醒我校园里的一门数学课……对于凸包中排除的单个顶点,内角>180。对于一系列顶点,递归研究由排除的顶点和序列两端包含的顶点形成的多边形凸包。这s的答案倒过来了——找到简单多边形的凸包的最有效方法是找到凹面内角。你能定义标量积吗?可能是点积。使用叉积要容易得多,因为假设你知道绕组,叉积定义得很好。标量积:x1*x2+y1*y2=scalarWherex和y代表与向量#相关的x和y位移,也就是说,不是en的坐标 1 n-1 A = --- SUM( x(i)*y(i+1) - x(i+1)*y(i) ) 2 i=0