判斷兩條線段是否相交__c

來源:互聯網
上載者:User

判斷兩條線段是否相交,可以採用向量積的方式來判斷,如下圖所示:

 

 

現定義一個函數初步判斷兩線段是否相交,如下代碼:

        /// <summary>

        /// 初步根據外圍框大致判斷兩條線段是否相交

        /// </summary>

        /// <param name="line01Coords">線段1的座標,長度為6</param>

        /// <param name="line02Coords">線段2的座標,長度為6</param>

        /// <returns>傳回型別為bool,如果為true表示兩條線段可能相交,如果為false表示兩條線段不相交</returns>

        private bool JudgeAboutCrossStatus(double[] line01Coords, double[] line02Coords)

        {

            bool returnResult = true;

            //先判斷在XY方向的最值

            double maxX1, minX1, maxY1, minY1;

            maxX1 = minX1 = line01Coords[0];

            maxY1 = minY1 = line01Coords[1];

            if (line01Coords[0] < line01Coords[3])

                maxX1 = line01Coords[3];

            else

                minX1 = line01Coords[3];

            if (line01Coords[1] < line01Coords[4])

                maxY1 = line01Coords[4];

            else

                minY1 = line01Coords[4];

            double maxX2, minX2, maxY2, minY2;

            maxX2 = minX2 = line02Coords[0];

            maxY2 = minY2 = line02Coords[1];

            if (line02Coords[0] < line02Coords[3])

                maxX2 = line02Coords[3];

            else

                minX2 = line02Coords[3];

            if (line02Coords[1] < line02Coords[4])

                maxY2 = line02Coords[4];

            else

                minY2 = line02Coords[4];

            //比較最值大小

            if ((minX1 > maxX2) || (maxX1 < minX2) || (minY1 > maxY2) || (maxY1 < minY2))

            {

                returnResult = false;

            }

            return returnResult;

        }

函數JudgeAboutCrossStatus()如果傳回值為true則表示兩條線段可能相交,則需要採用向量積的方式來判斷是否相交,如果為false則表示兩條線段不相交。現在定義一個函數Judge2LinesRelation ()用於判斷兩條線段是否相交,其代碼如下:

        /// <summary>

        /// 判斷兩條線段是否相交

        /// </summary>

        /// <param name="line01Coords">線段1的座標,長度為6</param>

        /// <param name="line02Coords">線段2的座標,長度為6</param>

        /// <returns>傳回型別為bool,如果為true表示兩條線段相交,如果為false表示兩條線段不相交</returns>

        private bool Judge2LinesRelation(double[] line01Coords, double[] line02Coords)

        {

            bool returnResult = true;

            returnResult = JudgeAboutCrossStatus(line01Coords, line02Coords);

            if (returnResult)//初步判斷兩條線段可能相交

            {

                double BAx, BAy, BCx, BCy, BDx, BDy, BABCk, BABDk;

                BAx = line01Coords[0] - line01Coords[3];

                BAy = line01Coords[1] - line01Coords[4];

                BCx = line02Coords[0] - line01Coords[3];

                BCy = line02Coords[1] - line01Coords[4];

                BABCk = BAx * BCy - BAy * BCx;

                BDx = line02Coords[3] - line01Coords[3];

                BDy = line02Coords[4] - line01Coords[4];

                BABDk = BAx * BDy - BAy * BDx;

                if (((BABCk > 0) && (BABDk > 0)) || ((BABCk < 0) && (BABDk < 0)))

                {

                    returnResult = false;

                }

                else if (((BABCk > 0) && (BABDk < 0)) || ((BABCk < 0) && (BABDk > 0)))

                {

                    double BCBDk;

                    BCBDk = BCx * BDy - BCy * BDx;

                    if (((BABDk > 0) && (BCBDk > 0)) || ((BABDk < 0) && (BCBDk < 0)))

                    {

                        returnResult = true;

                    }

                    else

                    {

                        returnResult = false;

                    }                   

                }

                else if ((BABCk == 0)||(BABDk==0))//點C或D在直線AB上

                {

                    double[] templine02Coords = new double[3];

                    if (BABCk == 0)//點C在直線AB上

                    {

                        templine02Coords[0] = line02Coords[0];

                        templine02Coords[1] = line02Coords[1];

                        templine02Coords[2] = line02Coords[2];

                    }

                    else//點D在直線AB上

        &

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.