Algorithm 求一个多边形的内角数,大于180º;

Algorithm 求一个多边形的内角数,大于180º;,algorithm,geometry,polygon,Algorithm,Geometry,Polygon,我如何找到一个多边形的内角数,大于180º, 只有多边形的顶点吗 对于每个顶点,我希望始终是内部角度,而不是外部角度 感谢巴西。这是一个与几何有关的问题,与编程无关 如果你有顶点,你可以通过三角法找到内角,就像你找到三角形的角度一样 使用三个相邻顶点,想象一个三角形,然后它们找到内角 例如,查看多边形: 我们可以将三角形构造为: 我假设这是一个不规则多边形,因为正多边形的内角很难大于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

  • 找到顶点的位置
  • 标识不位于凸面外壳上的顶点。这些是外部角度大于180的候选顶点
  • 对于每个这样的顶点,进一步研究角度(现在想不出任何方法,但可以扩展)

  • 切线的问题是当x==0时。如果你只知道多边形的顶点,除非它是三角形,否则你知道的还不够多,因为它们可以有任何形式的连通性


    假设知道连接性,则需要计算缠绕顺序(即,点围绕多边形的方向?)。根据缠绕顺序,可以取每个点与其相邻点的叉积,并取其大小的反正弦值以获得角度。

    只需取标量积(点积),即可确定两个向量的角度。一个有用的性质是,如果向量是正交的,那么它们的标量积为零;如果它们的角度是钝角,则乘积为负,否则为正。因此,应采取的步骤是:

    • 找到从V0到V1的第一条边(作为向量,通过减去坐标得到),然后向左旋转90度(这只是将
      (xy)
      转换为
      (-yx)
    • 找到从V1到V2的第二条边(未旋转)
    • 以标量积为例(这只是
      (x1*x2)+(y1*y2)
    • 如果标量积为负,则为右转,否则为左转
    • 下一个边缘
    • 如果逆时针穿过顶点,请计算右转弯的次数,否则计算左转弯的次数
    • 对于最后一个顶点,必须返回到第一个顶点(即使用边Vn到V0和V0到V1)
    编辑:通过使用以下公式计算多边形的面积,可以找到顶点是按逆时针顺序排列还是按顺时针顺序排列:

    1 n-1 A=---和(x(i)*y(i+1)-x(i+1)*y(i)) 2i=0

    其中
    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