国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

計算兩條直線的交點(C#)

2019-11-17 03:07:11
字體:
來源:轉載
供稿:網友

計算兩條直線的交點(C#)

PS:從其他地方看到的源碼是有問題的。下面是修正后的

/// <summary>        /// 計算兩條直線的交點        /// </summary>        /// <param name="lineFirstStar">L1的點1坐標</param>        /// <param name="lineFirstEnd">L1的點2坐標</param>        /// <param name="lineSecondStar">L2的點1坐標</param>        /// <param name="lineSecondEnd">L2的點2坐標</param>        /// <returns></returns>        public static PointF GetIntersection(PointF lineFirstStar, PointF lineFirstEnd, PointF lineSecondStar, PointF lineSecondEnd)        {            /*             * L1,L2都存在斜率的情況:             * 直線方程L1: ( y - y1 ) / ( y2 - y1 ) = ( x - x1 ) / ( x2 - x1 )              * => y = [ ( y2 - y1 ) / ( x2 - x1 ) ]( x - x1 ) + y1             * 令 a = ( y2 - y1 ) / ( x2 - x1 )             * 有 y = a * x - a * x1 + y1   .........1             * 直線方程L2: ( y - y3 ) / ( y4 - y3 ) = ( x - x3 ) / ( x4 - x3 )             * 令 b = ( y4 - y3 ) / ( x4 - x3 )             * 有 y = b * x - b * x3 + y3 ..........2             *              * 如果 a = b,則兩直線平等,否則, 聯解方程 1,2,得:             * x = ( a * x1 - b * x3 - y1 + y3 ) / ( a - b )             * y = a * x - a * x1 + y1             *              * L1存在斜率, L2平行Y軸的情況:             * x = x3             * y = a * x3 - a * x1 + y1             *              * L1 平行Y軸,L2存在斜率的情況:             * x = x1             * y = b * x - b * x3 + y3             *              * L1與L2都平行Y軸的情況:             * 如果 x1 = x3,那么L1與L2重合,否則平等             *             */            float a = 0, b = 0;            int state = 0;            if (lineFirstStar.X != lineFirstEnd.X)            {                a = (lineFirstEnd.Y - lineFirstStar.Y) / (lineFirstEnd.X - lineFirstStar.X);                state |= 1;            }            if (lineSecondStar.X != lineSecondEnd.X)            {                b = (lineSecondEnd.Y - lineSecondStar.Y) / (lineSecondEnd.X - lineSecondStar.X);                state |= 2;            }            switch (state)            {                case 0: //L1與L2都平行Y軸                    {                        if (lineFirstStar.X == lineSecondStar.X)                        {                            //throw new Exception("兩條直線互相重合,且平行于Y軸,無法計算交點。");                            return new PointF(0, 0);                        }                        else                        {                            //throw new Exception("兩條直線互相平行,且平行于Y軸,無法計算交點。");                            return new PointF(0, 0);                        }                    }                case 1: //L1存在斜率, L2平行Y軸                    {                        float x = lineSecondStar.X;                        float y = (lineFirstStar.X - x) * (-a) + lineFirstStar.Y;                        return new PointF(x, y);                    }                case 2: //L1 平行Y軸,L2存在斜率                    {                        float x = lineFirstStar.X;                        //網上有相似代碼的,這一處是錯誤的。你可以對比case 1 的邏輯 進行分析                            //源code:lineSecondStar * x + lineSecondStar * lineSecondStar.X + p3.Y;                        float y = (lineSecondStar.X - x) * (-b) + lineSecondStar.Y;                        return new PointF(x, y);                    }                case 3: //L1,L2都存在斜率                    {                        if (a == b)                        {                            // throw new Exception("兩條直線平行或重合,無法計算交點。");                            return new PointF(0, 0);                        }                        float x = (a * lineFirstStar.X - b * lineSecondStar.X - lineFirstStar.Y + lineSecondStar.Y) / (a - b);                        float y = a * x - a * lineFirstStar.X + lineFirstStar.Y;                        return new PointF(x, y);                    }            }            // throw new Exception("不可能發生的情況");            return new PointF(0, 0);        }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沿河| 沅陵县| 天峻县| 南昌市| 德钦县| 南和县| 阿克陶县| 五原县| 二连浩特市| 秦安县| 清河县| 锦州市| 安塞县| 法库县| 吉木萨尔县| 清原| 南漳县| 南华县| 武陟县| 岳池县| 温宿县| 雅安市| 靖宇县| 庆阳市| 井冈山市| 文水县| 济宁市| 鹰潭市| 贞丰县| 临潭县| 金门县| 安溪县| 辽阳市| 合阳县| 隆尧县| 万州区| 漠河县| 泸定县| 和平区| 沂南县| 昭苏县|