【轉】已知四邊形的四個點,求一個點是否在四邊形以內

已知四邊形(凸四邊形)的四個點A、B、C、D(按逆時針順序)的座標,求點P是否在ABCD所圍成的四邊形內,能夠經過向量叉乘的方法實現。spa

先提供一種簡單情景(假定四邊形是一個凸四邊形)的解決方法:.net

原理:凸多邊形內部的點都在凸多邊形的邊所在的向量的同一側(前提是計算邊所在的向量時採用的是同一個方向,同爲順時針或者同爲逆時針),利用叉積求解。
假設四邊形四個頂點依次爲A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),待判斷的點爲P(x,y),若是點P在四邊形內部,則向量AB * AP(注意:1.這是求叉積;2.AB、AP均爲向量,也就等於(x2-x1) * (y-y1)-(y2-y1) * (x-x1))的值與BC*BP、CD * CP、DA * DP的值同號(如有等於零的狀況,則表示P在邊上,能夠根據本身的喜愛把它當作是內部或者外部),即四個值同爲正或者同爲負,則點P在ABCD內部,不然在外部。
若是是凹四邊形還要作一些其餘處理,就是找到致使四邊形爲凹的那個頂點,也是藉助於叉積,而後把四邊形分紅兩個三角形(三角形確定是凸的了),再按照上面的方法計算叉積,便可解決。
總結:叉積是判斷多邊形凹凸性以及點是否在凸多邊形內部的利器。code

向量AB(B.x - A.x , B.y - A.y);blog

向量AP(P.x - A.x , P.y - A.y);get

向量叉乘ABxAP = (B.x - A.x) * (P.y - A.y) - (B.y - A.y) * (P.x - A.x);class

/// <summary>
        /// 判斷點是否在矩形內 /// </summary>
        /// <param name="x">座標點X</param>
        /// <param name="y">座標點Y</param>
        /// <param name="ps">矩形4個頂點</param>
        /// <returns></returns>
        private bool IsPointInRect(int x, int y, Point[] ps) { Point A = ps[0]; Point B = ps[1]; Point C = ps[2]; Point D = ps[3]; int a = (B.X - A.X) * (y - A.Y) - (B.Y - A.Y) * (x - A.X); int b = (C.X - B.X) * (y - B.Y) - (C.Y - B.Y) * (x - B.X); int c = (D.X - C.X) * (y - C.Y) - (D.Y - C.Y) * (x - C.X); int d = (A.X - D.X) * (y - D.Y) - (A.Y - D.Y) * (x - D.X); if ((a >= 0 && b >= 0 && c >= 0 && d >= 0) || (a <= 0 && b <= 0 && c <= 0 && d <= 0)) { return true; } // AB X AP = (b.x - a.x, b.y - a.y) x (p.x - a.x, p.y - a.y) = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x); // BC X BP = (c.x - b.x, c.y - b.y) x (p.x - b.x, p.y - b.y) = (c.x - b.x) * (p.y - b.y) - (c.y - b.y) * (p.x - b.x); 
            return false; }

 

原文地址:http://blog.csdn.net/laukaka/article/details/45168439原理

相關文章
相關標籤/搜索