专栏首页林德熙的博客C# 判断两条直线距离

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 条评论
登录 后参与评论

相关文章

  • 为何 987654321/123456789 的值是 8.0000000729

    有时候,发现 987654321/123456789=8.0000000729 为什么后面还有几个数字? 本文告诉大家,后面几个是如何算的

    林德熙
  • dotnet 在 NuGet 上搜寻好用的 dotnet tool 工具

    使用 dotnet tool 可以方便分发给小伙伴很多有趣的工具,而小伙伴们也可以通过 dotnet tool 一句命令安装上强大的工具。但有一个问题是,我如何...

    林德熙
  • 读书笔记 dotnet 什么时候进行垃圾回收

    是否有小伙伴好奇如果没有在代码调用垃圾回收,那么框架会在什么时候调用垃圾回收。本文是读还没出版的伟民哥翻译的 .NET内存管理宝典 - 提高代码质量、性能和可扩...

    林德熙
  • 第55节:Java当中的IO流-时间api(下)-上

    currentTimeMillis是用来返回当前时间的,单位以毫秒,其值的粒度取决于底层操作系统.它是与在1970年1月1日UTC之间的当前时间和午夜之间的差异...

    达达前端
  • js和native交互方法浅析

    一、背景 最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路。 二、解决方案之WebViewJavascriptBridge  想要和a...

    吴裕超
  • abp vnext2.0核心组件之DDD组件之实体结构源码解析

    接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源...

    郑小超.
  • 浏览器内核之资料加载与网络栈

    此文章是我最近在看的【WebKit 技术内幕】一书的一些理解和做的笔记。 而【WebKit 技术内幕】是基于 WebKit 的 Chromium 项目的讲解。 ...

    夜尽天明
  • django AJAX 的应用

    郭楷丰
  • 用注解解决业务逻辑和缓存逻辑的深度耦合

    spring3.1引入了基于注解的缓存技术,即spring cache模块,它不是一个具体的缓存实现方案,而是一个对缓存使用的抽象。你可以类比为JDBC,定义了...

    Java识堂
  • 微信小程序Ⅷ [WXSS 小知识积累]

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT

扫码关注云+社区

领取腾讯云代金券