检查三条直线是否共点

data structurec++programming

问题包括检查三条给定的直线是否共点。如果平面上的所有三条线都经过同一点,则称它们共点。它们必须恰好相交于一点才能共点。

上图描绘了三条共点线。根据上图,任何两条线的交点都应位于第三条线上才能共点。交点就是这些线的交点。众所周知,直线可以写成一个一般方程,例如$\mathrm{a_{1}x=b_{1}y+c_{1}=0}$或$\mathrm{y=mx+c}$

在本期中,我们将考虑直线的第一个广义方程。直线的系数在该方程中称为a1、b1和c1,而x和y代表直线经过的每个点的坐标。

我们将在本问题集中提供三条直线的系数值。我们必须确定这些行是否并发,并适当地打印输出。

让我们通过一些例子更好地理解这个问题:

输入

a=2 , b=-3 , c=4
d=9 , e=5 , f=-19
g=2 , h=-7, i=12

输出

Yes

解释:直线的广义形式是 $\mathrm{a_{1}x=b_{1}y+c_{1}=0}$ 。这里的输入 a、b 和 c 是第一条直线的系数,可以写成 2x-3y+4=0 。类似地,d、e 和 f 是第二条线的系数,即 9x+5y-19=0,而 g、h 和 i 是第三条线的系数 2x-7y+12=0。这三条线相交于点 (1,2),即共点。因此,这三条线是共点。

输入

a=6 , b=3 , c=-12
d=2 , e=1 , f=-5
g=5 , h=-1 , i=14

输出

No

解释:利用直线的一般方程,我们可以分别用它们的系数找到三条直线的方程。这三条直线分别是 6x+3y-12 、 2x+y-5=0 。如果我们观察前两条线,它们具有相同的斜率,这意味着它们是平行线,因此这三条线永远不会是共线,因为没有共同的交点。

为了解决上述问题,我们必须开发一种算法来检查给定的三条线是否有任何共同的交点。当所有线都经过一个点时,共线就存在,否则就不存在。我们现在要做的是使用算法检查公共交点。

算法

假设直线的三个方程为ax+by+c=0、dx+ey+f=0和gx+hy+i=0,其中a、b、c、d、e、f、g、h和i是将作为输入提供的相应直线的系数。我们需要检查这三条线是否有任何公共交点。

共线仅在一个点相交。在数学中,如果三条线共点,则由这三条线的系数组成的矩阵的行列式值为0。

由三条线的系数组成的矩阵为:

$\mathrm{\begin{vmatrix}a & b & c\\d & e & f\\g & h & i \end{vmatrix}\:=\:0}$

如果给定的线共点,则上述矩阵的行列式为零。

我们只需要计算由三条线的系数组成的矩阵的行列式值即可解决问题。

计算矩阵行列式的公式为:

a ∗ (e ∗ i − f ∗ h) − b ∗ (d ∗ i − f ∗ g) + c ∗ (d ∗ h − e ∗ g) =矩阵的行列式

当将三条线的系数值代入上述公式时,如果结果值为 0,则三条线共点。根据数学,如果矩阵的行列式的值不为 0,则给定的线不是共点线。

要确定这些线是否共点,我们将使用上述公式。

方法

为了解决这个问题,我们将实现上述算法。在我们的方法中,必须采取以下步骤:

  • 我们将编写一个函数来确定给定的直线是否并发。

  • 声明一个变量,然后将其设置为由指定直线的系数组成的矩阵的行列式的值。

  • 我们将检查变量的值是否为 0。如果值为零,我们将返回 true。

  • 如果变量的值中包含除 0 以外的任何值,我们将返回 false。

  • 如果函数返回 true,则在驱动程序代码中打印三行并发的语句,否则,打印三行不并发的语句。

该方法的 C++ 代码:

示例

#include <bits/stdc++.h>

using namespace std;

//函数检查给定的三行是否并发
bool check(int a, int b, int c,
           int d, int e, int f, 
           int g, int h, int i)
{
    //存储由三行系数组成的矩阵的行列式的值
    
    long long int ans= (a*(e*i-f*h) - b*(d*i-f*g) + c*(d*h-e*g));
    
    if(ans==0){ //如果行列式的值等于0,则它们是并发的
        return true;
    }
    
    else //矩阵的行列式的值是除0以外的任何值
    return false;
                   
    
}

int main()
{
    int a, b, c;
    int d, e, f;
    int g, h, i;
    
    a=3, b=4, c=-13;
    d=2, e=-7, f=1;
    g=5, h=-1, i=-14;
    
    //存储函数的输出
    bool parallel=check(a,b,c,d,e,f,g,h,i);
    
    if(concurrent==true){ //如果函数返回 true
        cout<<"给定的三行是并发的"<<endl;
    }
    
    else //如果函数返回 false
    cout<<"给定的三行不是并发的"<<endl;
    
    return 0;
}

输出

给定的三条线是并发的

时间复杂度:O(1),因为需要花费恒定的时间来检查这些线是否并发。

空间复杂度:O(1),因为我们没有使用任何额外的空间。

结论

我们讨论了并发线的概念,并提供了一种实用的 C++ 方法来确定所呈现的三条直线是否并发。我们使用了使用简单数学思想的方法。

阅读这篇文章后,我希望您完全理解解决问题所需的概念。


相关文章