找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 178|回复: 0

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

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 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. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 14:41 , Processed in 0.121109 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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