計算機幾何 - 如何判斷一個多邊形是凸多邊形還是凹多邊形

什麼是凸多邊形和凹多邊形?
凸多邊形:每個內角都是銳角或鈍角,沒有大於180度的內角(例如,三角形、正方形)。
在這裏插入圖片描述
凹多邊形:至少有一個大於180度的內角(例如,五角星)。
注:大於180度的角又被稱爲優角
如上圖,D點就是優角
如上圖,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;
}

參考連接:
凹多邊形
向量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章