C#判斷多邊形的凹凸性

來源:互聯網
上載者:User

標籤: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#判斷多邊形的凹凸性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.