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 所以需要这个方法

MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏学习有记

[LeetCode Python3]566. Reshape the Matrix(重塑矩阵)

在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。

2282
来自专栏尾尾部落

小白的机器学习实战——向量,矩阵和数组 小白的机器学习实战——向量,矩阵和数组

1504
来自专栏机器学习算法与Python学习

机器学习(34)之BIRCH层次聚类详解

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 在K-Means算法(机器学习...

4465
来自专栏我是业余自学C/C++的

对角矩阵

1372
来自专栏利炳根的专栏

学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵

线性代数,面向连续数学,非离散数学。《The Matrix Cookbook》,Petersen and Pedersen,2006。Shilov(1977)。

3880
来自专栏决胜机器学习

从机器学习学python(四) ——numpy矩阵基础

从机器学习学python(四)——numpy矩阵基础 (原创内容,转载请注明来源,谢谢) 一、numpy中matrix 和 array的区别 ...

4717
来自专栏上善若水

002计算机图形学之直线画线算法

主要思想是,由于我们在缓存区上画点,全部是整数。那么在画线的时候,当斜率k小于1的时候,下一个点是取(x+1,y+1)还是(x+1,y)取决于点(x+1,y+0...

2672
来自专栏机器学习算法原理与实践

BIRCH聚类算法原理

    在K-Means聚类算法原理中,我们讲到了K-Means和Mini Batch K-Means的聚类原理。这里我们再来看看另外一种常见的聚类算法BIRC...

1611
来自专栏ml

python科学计算之numpy

1.np.logspace(start,stop,num): 函数表示的意思是;在(start,stop)间生成等比数列num个 eg:  import num...

3716
来自专栏应兆康的专栏

Accuracy

$A_{cc}=\frac{1}{n}\sum{I(\hat{y}_i=y_i)}$

921

扫码关注云+社区

领取腾讯云代金券