本文告诉大家获得两条一般式直线距离



一般式的意思就是


Ax+By+C=0 A x + B y + C = 0

如果有两个直线


A1x+B1y+C1=0A2x+B2y+C2=0 A 1 x + B 1 y + C 1 = 0 A 2 x + B 2 y + C 2 = 0

如何判断两条直线的距离

如果需要判断两条直线的距离,首先两条直线需要是平行

判断一般式直线平行的方法


A1B2−A2B1≈0 A 1 B 2 − A 2 B 1 ≈ 0

如果两条直线符合上面公式,可以认为两条直线平行。

对于一般的两条直线,获得距离的公式


d=|C1−C2|A2+B2−−−−−−−√ d = | C 1 − C 2 | A 2 + B 2

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


A1x+B1y+C1=0A2xA1A2+B2yA1A2+C2A1A2=0A1x+B1y+C2A1A2=0 A 1 x + B 1 y + C 1 = 0 A 2 x A 1 A 2 + B 2 y A 1 A 2 + C 2 A 1 A 2 = 0 A 1 x + B 1 y + C 2 A 1 A 2 = 0

这时的距离公式是


d=∣∣C1−C2A1A2∣∣A21+B21−−−−−−−√ d = | C 1 − C 2 A 1 A 2 | A 1 2 + B 1 2

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

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


B1y+C1=0B1y+C2B1B2=0 B 1 y + C 1 = 0 B 1 y + C 2 B 1 B 2 = 0

这时距离公式


d=∣∣C1−C2B1B2∣∣B1 d = | C 1 − C 2 B 1 B 2 | B 1

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


A1x+C1=0A1x+C2A1A2=0 A 1 x + C 1 = 0 A 1 x + C 2 A 1 A 2 = 0

这时距离公式


d=∣∣C1−C2A1A2∣∣A1 d = | C 1 − C 2 A 1 A 2 | 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?);
}

我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙,不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。