2018-7-31-C#-判断两条直线距离
title | author | date | CreateTime | categories |
---|---|---|---|---|
C# 判断两条直线距离
|
lindexi
|
2018-07-31 14:38:13 +0800
|
2018-05-08 10:32:50 +0800
|
数学 C# 几何
|
本文告诉大家获得两条一般式直线距离。
一般式的意思就是
$$
Ax+By+C=0
$$
如果有两个直线
$$
A_1x+B_1y+C_1=0 \
A_2x+B_2y+C_2=0
$$
如何判断两条直线的距离?
如果需要判断两条直线的距离,首先两条直线需要是平行
判断一般式直线平行的方法
$$
A_1B_2-A_2B_1 \approx 0
$$
如果两条直线符合上面公式,可以认为两条直线平行。
对于一般的两条直线,获得距离的公式
$$
d= \frac{ \left| C_1-C_2 \right|}{\sqrt{A^2+B^2}}
$$
但是因为两个直线一般式的 AB 是不相等的,所以需要把两个直线转换相同的 AB
$$
A_1x+B_1y+C_1=0 \
A_2x\frac{A_1}{A_2}+B_2y\frac{A_1}{A_2}+C_2\frac{A_1}{A_2}=0 \
A_1x+B_1y+C_2\frac{A_1}{A_2}=0
$$
这时的距离公式是
$$
d= \frac{ \left| C_1-C_2\frac{A_1}{A_2}\right|}{\sqrt{A_1^2+B_1^2}}
$$
但是存在 A 或 B 是 0 ,所以就不能直接使用上面的距离
如果$a=0 ,b \neq 0$ 那么需要修改直线公式
$$
B_1y+C_1=0 \
B_1y+C_2\frac{B_1}{B_2}=0
$$
这时距离公式
$$
d= \frac{ \left| C_1-C_2\frac{B_1}{B_2}\right|}{B_1}
$$
如果$a\neq0 ,b = 0$ 那么需要修改直线公式
$$
A_1x+C_1=0 \
A_1x+C_2\frac{A_1}{A_2}=0
$$
这时距离公式
$$
d= \frac{ \left| C_1-C_2\frac{A_1}{A_2}\right|}{A_1}
$$
因为我是在编程,我可以拿到距离平方,这样可以减少开方,我把上面的公式写为代码,代码是C#不过大家可以把他使用其他语言
- /// <summary>
- /// 获得两条直线的距离,传入的直线已经是判断平行
- /// </summary>
- /// <param name="otherLine"></param>
- /// <returns></returns>
- public double? GetDistanceWithLineSquare(LineEquation otherLine)
- {
- var aIsZero = A.IsZero();
- var bIsZero = B.IsZero();
- //D=|C1-C2|/sqrt(A^2+B^2)
- // A 是 0 ,但是 B 不是 0
- if (aIsZero && !bIsZero)
- {
- //B1Y+C1=0 B1Y+B1/B2*C2=0
- return Math.Abs(C - B / otherLine.B * otherLine.C) / B*B;
- }
- if (!aIsZero && bIsZero)
- {
- //A1X+C1=0 A1X+A1/A2*C2=0
- return Math.Abs(C - A / otherLine.A * otherLine.C) / A*A;
- }
- if (!aIsZero && !bIsZero)
- {
- return Math.Abs(C - A / otherLine.A * otherLine.C) / (A * A + B * B);
- }
- if (aIsZero && bIsZero)
- {
- return default(double?);
- }
- return default(double?);
- }
上面代码的 A.IsZero()
就是判断 A 是不是为 0 ,在 C# 很难判断 double 是不是为 0 所以需要这个方法
<script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML">
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script>
2018-7-31-C#-判断两条直线距离的更多相关文章
- C# 判断两条直线距离
本文告诉大家获得两条一般式直线距离 一般式的意思就是 Ax+By+C=0" role="presentation">Ax+By+C=0Ax+By+C=0 如果有两个 ...
- POJ1269:Intersecting Lines(判断两条直线的关系)
题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...
- 判断两条直线的位置关系 POJ 1269 Intersecting Lines
两条直线可能有三种关系:1.共线 2.平行(不包括共线) 3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...
- Intersecting Lines--POJ1269(判断两条直线的关系 && 求两条直线的交点)
http://poj.org/problem?id=1269 我今天才知道原来标准的浮点输出用%.2f 并不是%.2lf 所以wa了好几次 题目大意: 就给你两个线段 然后求这两个线段所在的 ...
- POJ 1269 /// 判断两条直线的位置关系
题目大意: t个测试用例 每次给出一对直线的两点 判断直线的相对关系 平行输出NODE 重合输出LINE 相交输出POINT和交点坐标 1.直线平行 两向量叉积为0 2.求两直线ab与cd交点 设直线 ...
- C# 判断两条直线是否相交
直接上代码,过程不复杂 /// <summary> /// 判断两条线是否相交 /// </summary> /// <param name="a"& ...
- cocos2d-x 判断两条直线是否相交
bool GraphicsUtil::linesCross(b2Vec2 v0, b2Vec2 v1, b2Vec2 t0, b2Vec2 t1, b2Vec2 &intersectionPo ...
- poj 1269(两条直线交点)
Intersecting Lines Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13481 Accepted: 59 ...
- 求空间内两条直线的最近距离以及最近点的坐标(C++)
关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...
随机推荐
- Linux ar命令介绍 和常用示例
制作静态库要用到ar命令,命令格式: ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... {dmpqrtx}中的 ...
- 利用Factory-boy来生成实例数据
库和版本:Faker==2.0.0factory-boy==2.12.0 官方文档:https://factoryboy.readthedocs.io/en/latest/index.html 1. ...
- Servlet各种接口和类
http://blog.csdn.net/jediael_lu/article/details/25036019
- 公司电脑安装mysql出现小问题
按步骤将mysql安装好后,在自己电脑完全没问题,但是在公司电脑安装的时候出现了这样的问题. 查阅资料以后,找到了问题: 参考链接:https://blog.csdn.net/huacode/arti ...
- pl/sql基础知识—触发器
n 触发器简单介绍 触发器是指隐含执行的存储过程,它不是由程序员或者是DBA来显式调用,而是因为某个操作引发执行的.当定义触发器时,必须要指定触法的事件和触发的操作,常用的触发事件包括insert, ...
- Leetcode784.Letter Case Permutation字母大小写全排列
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" 输出: ["a1 ...
- 【JZOJ4359】【GDKOI2016】魔卡少女
题目描述 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时一只看上去 ...
- python socketserver ftp上传功能
一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...
- postman认证使用篇(五)
postman 认证使用篇(五) Authorization 尽管请求编辑器已经足够强大去构造各种各样的请求,但是有的时候你的请求可能是需要认证,那么就可以尝试使用下面的认证功能了(由于认证的参数信息 ...
- vim删除行
0,vim filename 1,显示行号 :set number 2,跳转到第1000行 1000G (跳转到文件末尾:“G”) 3,删除1-1000行 :1,.d 4,删除所有行 先跳转到文件最后 ...