求两直线的交点(C++)

假设两直线的式子分别为:

\left\{\begin{matrix} L1:A_{1}x + B_{1}y + C_{1} = 0 \\ L2:A_{2}x + B_{2}y + C_{2} = 0 \end{matrix}\right.

求解过程: 

(1) L_{1} * A_{2} - L_{2} * A_{1}

L_{1} * A_{2} \Rightarrow A_{1} A_{2} x + A_{2} B_{1} y + A_{2} C_{1} = 0;

L_{2} * A_{1} \Rightarrow A_{1} A_{2} x + A_{1} B_{2} y + A_{1} C_{2} = 0;

L_{1} * A_{2} - L_{2} * A_{1} \Rightarrow A_{2} B_{1} y - A_{1} B_{2} y + A_{2} C_{1} - A_{1} C_{2} = 0

\Rightarrow y = (A_{1} C_{2} - A_{2} C_{1} ) / (A_{2} B_{1} - A_{1} B_{2}).

(2)L_{1} * B_{2} - L_{2} * B_{1}

L_{1} * B_{2} \Rightarrow A_{1} B_{2} x + B_{1} B_{2} y + B_{2} C_{1} = 0;

L_{2} * B_{1} \Rightarrow A_{2} B_{1} x + B_{1} B_{2} y + B_{1} C_{2} = 0;

L_{1} * B_{2} - L_{2} * B_{1} \Rightarrow A_{1} B_{2} x - A_{2} B_{1} x + B_{2} C_{1} - B_{1} C_{2} = 0

\Rightarrow x = (B_{2} C_{1} - B_{1} C_{2}) / (A_{2} B_{1} - A_{1} B_{2}).

(3) 综上所述,交点的解为:

\left\{\begin{matrix} x = (B_{2} C_{1} - B_{1} C_{2}) / (A_{2}B_{1} - A_{1} B_{2}) \\ y = (A_{1} C_{2} - A_{2} C_{1}) / (A_{2} B_{1} - A_{1} B_{2}) \end{matrix}\right.

(A2 B1 - A1 B2) \neq 0 则有解,否则两直线平行。

补充:如果化成Y=kX+b的形式的话,得解为:

\left\{\begin{matrix}x=(b_{2}-b_{1})/(k_{1}-k_{2}) \\ y = (k_{1}b_{2}-k_{2}b_{1})/(k_{1}-k_{2}) \end{matrix}\right.

例题:Audio

给定三个不共线的点,要求输出一个点使得这个点到三个点的距离相同,输出保留三位小数。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    double x1,y1,x2,y2,x3,y3;
    scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
    double k1=(y1-y2)/(x1-x2),k2=(y1-y3)/(x1-x3);
    k1=-1/k1,k2=-1/k2;
    double x=(x1+x2)/2,y=(y1+y2)/2;
    double b1=y-k1*x;
    x=(x1+x3)/2,y=(y1+y3)/2;
    double b2=y-k2*x;
    double X=(b2-b1)/(k1-k2);
    double Y=(k1*b2-k2*b1)/(k1-k2);
    printf("%.3f %.3f\n",X,Y);

    return 0;
}

 


版权声明:本文为qq_41117236原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。