首页 > 代码库 > 计算两条直线的交点(C#)
计算两条直线的交点(C#)
从其他地方看到的源码是有问题的。
/// <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); }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。