两条直线的交点 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++ 根据两点式方法求直线并求两条直线的交点

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

Intersecting Lines--POJ1269(判断两条直线的关系 && 求两条直线的交点)

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

求两条直线相交点 AS3代码

,); ,); ,); ,); 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(两条直线交点)

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

判断两条直线的位置关系 POJ 1269 Intersecting Lines

两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...

求空间内两条直线的最近距离以及最近点的坐标(C++)

关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...

POJ1269:Intersecting Lines(判断两条直线的关系)

题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

两条直线(蓝桥杯)二分枚举+RMQ

算法提高 两条直线   时间限制:1.0s   内存限制:256.0MB        问题描述 给定平面上n个点. 求两条直线,这两条直线互相垂直,而且它们与x轴的夹角为45度,并且n个点中离这两条 ...

随机推荐

解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误

一.问题描述 1.错误截图如下. 2.设计的问题 在Eclipse中新建了一个Maven工程, 然后更改JDK版本为1.6, 结果每次使用Maven > Update project的时候JDK ...

允许Sublime编辑器在Ubuntu上输入中文

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

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

同一个控件,subscribeEvent与宏定义不能同时响应,优先响应sub 所以,同一个控件的同一个消息,要想在多个地方响应,就必须sub方式订阅

Android--ListView与数据绑定(Xamarin)

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

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...

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

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

Codevs 3287 货车运输

题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...

php-fpm.conf两个至关重要的参数

这里规定了PHP-CGI的连接.发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误.最关键的是php-fpm.conf的设置,这个会直接导致50 ...

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

接触WPF也有两个多月了,有了一定的理论基础和项目经验,现在打算写一个系列,做出来一个WPF的控件库.一方面可以加强自己的水平,另一方面可以给正在学习WPF的同行一个参考.本人水平有限,难免有一些错误 ...

【HDOJ】1171 Big Event in HDU

母函数,先要算搞清楚组合数可能的最大值.非常大.N种设备的最大VAL*最大数量. #include #include #define ...

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值