zoukankan      html  css  js  c++  java
  • 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 ight|}{sqrt{A^2+B^2}} $$

    但是因为两个直线一般式的 AB 是不相等的,所以需要把两个直线转换相同的 AB

    $$ A_1x+B_1y+C_1=0 A_2xfrac{A_1}{A_2}+B_2yfrac{A_1}{A_2}+C_2frac{A_1}{A_2}=0 A_1x+B_1y+C_2frac{A_1}{A_2}=0 $$

    这时的距离公式是

    $$ d= frac{ left| C_1-C_2frac{A_1}{A_2} ight|}{sqrt{A_1^2+B_1^2}} $$

    但是存在 A 或 B 是 0 ,所以就不能直接使用上面的距离

    如果$a=0 ,b eq 0$ 那么需要修改直线公式

    $$ B_1y+C_1=0 B_1y+C_2frac{B_1}{B_2}=0 $$

    这时距离公式

    $$ d= frac{ left| C_1-C_2frac{B_1}{B_2} ight|}{B_1} $$

    如果$a eq0 ,b = 0$ 那么需要修改直线公式

    $$ A_1x+C_1=0 A_1x+C_2frac{A_1}{A_2}=0 $$

    这时距离公式

    $$ d= frac{ left| C_1-C_2frac{A_1}{A_2} ight|}{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>
  • 相关阅读:
    复习提纲
    查看版本和存储的地方
    0到255的颜色
    stixel-world和psmnet结合出现的问题
    python plt 保存jpg出错
    三和韓長庚 著 正易 對讀 161-200
    startActivity、 startActivityForResult 、广播的使用
    01背包+卡精度 Hdu 2955
    c++ string 之 find_first_not_of 源码
    java:[1,0] illegal character: 65279 问题
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086261.html
Copyright © 2011-2022 走看看