標籤:for 方法 使用者 blog 存在 標準 需要 頂點 vector
最近項目中需要加入通過滑鼠點擊自由繪製多邊形的功能,為了防止使用者不依次選取多邊形的定點,結合需求通過如下方法實現:
我們知道任意n個頂點的凸多邊形可以分解成(n-2)個三角形,一個三角形的內角和是180°,所有三角形的內角和是(n-2)*180°,這一點,對於凸多邊形或者凹多邊形來說都是一樣的,但是對於一個凸多邊形來說,不存在內角大於外角,而凹多邊形則會存在。
bool IsHollow(List<Vector3> curveloopPoints) { //使用角度和判斷凹凸性:凸多邊形的內角和為(n-2)*180° var num = curveloopPoints.Count; float angleSum = 0.0f; for (int i = 0; i < num; i++) { Vector3 e1; if (i == 0) { e1 = curveloopPoints[num - 1] - curveloopPoints[i]; } else { e1 = curveloopPoints[i - 1] - curveloopPoints[i]; } Vector3 e2; if (i == num - 1) { e2 = curveloopPoints[0] - curveloopPoints[i]; } else { e2 = curveloopPoints[i + 1] - curveloopPoints[i]; } //標準化 e1.Normalize(); e2.Normalize(); //計算點乘 float mdot = Vector3.Dot(e1, e2); //計算夾角弧度 float theta = Mathf.Acos(mdot); //注意計算內角 angleSum += theta; } //計算內角和 float convexAngleSum = (float)((num - 2)) * Mathf.PI; //判斷凹凸性 if (angleSum < (convexAngleSum - (num * 0.00001))) { return true;//是凹 } return false;//否則是凸 }
C#判斷多邊形的凹凸性