打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
计算两条直线的交点(C#)
计算两条直线的交点(C#)
2010-03-09 13:06  iceser

        /// <summary>
        /// 计算两条直线的交点
        /// </summary>
        /// <param name="p1">L1的点1坐标</param>
        /// <param name="p2">L1的点2坐标</param>
        /// <param name="p3">L2的点1坐标</param>
        /// <param name="p4">L2的点2坐标</param>
        /// <returns></returns>
        static PointF GetIntersection( PointF p1, PointF p2, PointF p3, PointF p4 )
        {
            /*
             * 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 (p1.X != p2.X)
            {
                a = (p2.Y - p1.Y) / (p2.X - p1.X);
                state |= 1;
            }
            if (p3.X != p4.X)
            {
                b = (p4.Y - p3.Y) / (p4.X - p3.X);
                state |= 2;
            }
            switch (state)
            {
                case 0: //L1与L2都平行Y轴
                    {
                        if (p1.X == p3.X)
                        {
                            throw new Exception("两条直线互相重合,且平行于Y轴,无法计算交点。");
                        }
                        else
                        {
                            throw new Exception("两条直线互相平行,且平行于Y轴,无法计算交点。");
                        }
                    }
                case 1: //L1存在斜率, L2平行Y轴
                    {
                        float x = p3.X;
                        float y = a * x - a * p1.X + p1.Y;
                        return new PointF(x, y);
                    }
                case 2: //L1 平行Y轴,L2存在斜率
                    {
                        float x = p1.X;
                        float y = b * x + b * p3.X + p3.Y;
                        return new PointF(x, y);
                    }
                case 3: //L1,L2都存在斜率
                    {
                        if (a == b)
                        {
                            throw new Exception("两条直线平行或重合,无法计算交点。");
                        }
                        float x = (a * p1.X - b * p3.X - p1.Y + p3.Y) / (a - b);
                        float y = a * x - a * p1.X + p1.Y;
                        return new PointF(x, y);
                    }
            }
            throw new Exception("不可能发生的情况");
        }
 
 
 
 

编辑本段直线的一般式方程

  适用于所有直线
  Ax+By+C=0
  其中A,B不[同时为0]
  该直线的斜率为-A/B(B=0时没有斜率)
  直线的一般式方程能够表示坐标平面内的任何直线。
  当方程Ax+By+C=0,(1)平行于x轴时,A=0 B≠0 C≠0 y=-C/B
  ⑵平行于y轴时,A≠0 B=0 C≠0 x=-c/A
  ⑶与x轴重合时,A=0 B≠0 C=0 y=0
  ⑷与y轴重合时,A≠0 B=0 C=0 x=0
  ⑸过原点时,C=A^2+B^2=0

编辑本段关于直线的一般式方程的结论

  两直线平行时:A1/A2=B1/B2≠C1/C2
  两直线垂直时:A1A2+B1B2=0
  两直线重合时:A1/A2=B1/B2=C1/C2
  两直线相交时:A1/A2≠B1/B2
 
 
 
 
 
 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
高考数学解题技巧
点与线、线与线、距离这些一锅煮,你能否顺利消化
2011年高考分类汇编之解析几何(五)
两条直线的交点坐标课件PPT
一条直线被两条直线L1:2x+y+3=0,L2:2x-3y-6=0
直线方程里的公式大集合
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服