天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 172|回复: 0

如何判断一个多边形是凸多边形还是凹多边形

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-3-2 20:46:28 | 显示全部楼层 |阅读模式
    1. 如何判断一个多边形是凹多边形还是凸多边形?
    2. 1.角度和判断:将多边形每个顶点处的较小角(内角或外角)相加,如果小于(n-2)*180,则为凹多边形。(可以使用向量点乘来等价求两个向量的夹角,它的值(角)总是以较短的弧度来度量)
    3. 实现:
    4. public static bool IsConcavePolygon(Vector2[] points)
    5. {
    6.         int totalAngle = (points.Length - 2) * 180;
    7.         float angle = 0;
    8.         for(int i=0;i<points.Length;i++)
    9.         {
    10.                 Vector2 v1,v2;
    11.                 //向量1
    12.                 if(i==0)
    13.                         v1=points[points.Length-1]-points[i];
    14.                 else
    15.                         v1=points[i-1]-points[i];
    16.                 //向量2
    17.                 if(i==points.Length-1)
    18.                         v2=points[0]-points[i];
    19.                 else
    20.                         v2 = points[i+1]-points[i];
    21.                 //计算夹角:Mathf.Acos(Mathf.Clamp(Vector2.Dot(v1.normalized,to.normalized),-1f,1f))*57.29578f;
    22.                 float a = Vector2.Angle(v1,v2);
    23.                 angle+=a;
    24.         }
    25.         return angle<totalAngle;       
    26. }
    27. 2.检测凹点:凸多变形的每个顶点的转向都应该是一致的,不一致的点就是凹点。(向量的叉乘)
    28. 实现:
    29. //假设传入的是逆时针单向链
    30. //判断两个向量的转向,如果是逆时针转,则为凸点,顺时针转则为凹点
    31. public static bool IsConcavePolygon(Vector2[] points)
    32. {
    33.         for(int i=0;i<points.Length;i++)
    34.         {
    35.                 Vector2 v1,v2;
    36.                 //向量1
    37.                 if(i==0)
    38.                         v1=points[points.Length-1]-points[i];
    39.                 else
    40.                         v1=points[i-1]-points[i];
    41.                 //向量2
    42.                 if(i==points.Length-1)
    43.                         v2=points[0]-points[i];
    44.                 else
    45.                         v2 = points[i+1]-points[i];
    46.                 //计算叉积,根据三维叉积公式计算,z轴为0
    47.                 float corss = v1.x*v2.y-v1.y*v2.x;
    48.                 if(corss>0)
    49.                         return true;
    50.         }
    51.         return false;
    52. }
    复制代码

     

     

     

     

    如何判断一个多边形是凸多边形还是凹多边形
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 10:21 , Processed in 0.152191 second(s), 26 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表