zoukankan      html  css  js  c++  java
  • 计算两条直线的交点(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);
            }
  • 相关阅读:
    Linux计划任务Crontab实例详解教程
    配置Linux任务计划
    全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment
    Multipath多路径冗余全解
    Ubuntu 查看文件以及磁盘空间大小管理
    转载
    grep的用法
    Python标准库06 子进程 (subprocess包)
    Python与shell的3种交互方式介绍
    python和shell变量互相传递的几种方法
  • 原文地址:https://www.cnblogs.com/xiaotiannet/p/3768611.html
Copyright © 2011-2022 走看看