# 两条直线的交点 c语言,计算两条直线的交点(C#)

PS:从其他地方看到的源码是有问题的。下面是修正后的

///

/// 计算两条直线的交点

///

/// L1的点1坐标

/// L1的点2坐标

/// L2的点1坐标

/// L2的点2坐标

///

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 = , b = ;

int state = ;

if (lineFirstStar.X != lineFirstEnd.X)

{

a = (lineFirstEnd.Y - lineFirstStar.Y) / (lineFirstEnd.X - lineFirstStar.X);

state |= ;

}

if (lineSecondStar.X != lineSecondEnd.X)

{

b = (lineSecondEnd.Y - lineSecondStar.Y) / (lineSecondEnd.X - lineSecondStar.X);

state |= ;

}

switch (state)

{

case : //L1与L2都平行Y轴

{

if (lineFirstStar.X == lineSecondStar.X)

{

//throw new Exception("两条直线互相重合，且平行于Y轴，无法计算交点。");

return new PointF(, );

}

else

{

//throw new Exception("两条直线互相平行，且平行于Y轴，无法计算交点。");

return new PointF(, );

}

}

case : //L1存在斜率, L2平行Y轴

{

float x = lineSecondStar.X;

float y = (lineFirstStar.X - x) * (-a) + lineFirstStar.Y;

return new PointF(x, y);

}

case : //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 : //L1，L2都存在斜率

{

if (a == b)

{

// throw new Exception("两条直线平行或重合，无法计算交点。");

return new PointF(, );

}

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(, );

}

C&plus;&plus; 根据两点式方法求直线并求两条直线的交点

Line.h #pragma once //Microsoft Visual Studio 2015 Enterprise //根据两点式方法求直线,并求两条直线的交点 #include"B ...

Intersecting Lines--POJ1269&lpar;判断两条直线的关系 &amp&semi;&amp&semi; 求两条直线的交点&rpar;

http://poj.org/problem?id=1269 我今天才知道原来标准的浮点输出用%.2f   并不是%.2lf  所以wa了好几次 题目大意:   就给你两个线段 然后求这两个线段所在的 ...

,); ,); ,); ,); var p:Point = new Point(); trace(checkPoint()) function checkPoint() { if (p1Start.x ...

AS3 求两条直线的交点

//粘贴到帧上运行即可 var p1Start:Point = new Point(0,0); var p1End:Point = new Point(50,50); var p2Start:Poin ...

poj 1269&lpar;两条直线交点&rpar;

Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13481   Accepted: 59 ...

POJ1269&colon;Intersecting Lines(判断两条直线的关系)

Sublime Text是一款功能非常强大的轻量级代码编辑器,有关功能介绍和使用可以看我另一篇文章的描述http://www.cnblogs.com/jaxu/p/5037547.html 不过,在U ...

soui中subscribeEvent订阅控件消息与宏订阅注意事项

Android--ListView与数据绑定&lpar;Xamarin&rpar;

ListView 控件是一个条目容器, 用于显示集合对象(如数组, List, ObservableCollection等)的每一个条目, 并提供滚动功能. 列表视 ...

Caffe使用：如何将一维数据或其他非图像数据转换成lmdb

caffe事儿真多,数据必须得lmdb或者leveldb什么的才行,如果数据是图片的话,那用caffe自带的convert_image.cpp就行,但如果不是图片,就得自己写程序了.我也不是计算机专业 ...

Codevs 3287 货车运输

php-fpm&period;conf两个至关重要的参数

WPF自定义控件(一)——Button

【HDOJ】1171 Big Event in HDU

06-12 1306

02-09 9895
12-20 422
08-20 2024
05-19 594
12-29 5357
07-11 1449
07-11 1549
05-03 6614

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助