什麼是凸多邊形和凹多邊形?
凸多邊形:每個內角都是銳角或鈍角,沒有大於180度的內角(例如,三角形、正方形)。
凹多邊形:至少有一個大於180度的內角(例如,五角星)。
注:大於180度的角又被稱爲優角
如上圖,D點就是優角
如何判斷一個多邊形是凹多邊形還是凸多邊形?
1.角度和判斷:將多邊形每個頂點處的較小角(內角或外角)相加,如果小於(n-2)*180,則爲凹多邊形。(可以使用向量點乘來等價求兩個向量的夾角,它的值(角)總是以較短的弧度來度量)
實現:
public static bool IsConcavePolygon(Vector2[] points)
{
int totalAngle = (points.Length - 2) * 180;
float angle = 0;
for(int i=0;i<points.Length;i++)
{
Vector2 v1,v2;
//向量1
if(i==0)
v1=points[points.Length-1]-points[i];
else
v1=points[i-1]-points[i];
//向量2
if(i==points.Length-1)
v2=points[0]-points[i];
else
v2 = points[i+1]-points[i];
//計算夾角:Mathf.Acos(Mathf.Clamp(Vector2.Dot(v1.normalized,to.normalized),-1f,1f))*57.29578f;
float a = Vector2.Angle(v1,v2);
angle+=a;
}
return angle<totalAngle;
}
2.檢測凹點:凸多變形的每個頂點的轉向都應該是一致的,不一致的點就是凹點。(向量的叉乘)
實現:
//假設傳入的是逆時針單向鏈
//判斷兩個向量的轉向,如果是逆時針轉,則爲凸點,順時針轉則爲凹點
public static bool IsConcavePolygon(Vector2[] points)
{
for(int i=0;i<points.Length;i++)
{
Vector2 v1,v2;
//向量1
if(i==0)
v1=points[points.Length-1]-points[i];
else
v1=points[i-1]-points[i];
//向量2
if(i==points.Length-1)
v2=points[0]-points[i];
else
v2 = points[i+1]-points[i];
//計算叉積,根據三維叉積公式計算,z軸爲0
float corss = v1.x*v2.y-v1.y*v2.x;
if(corss>0)
return true;
}
return false;
}