直线的表达式
一般式
A x + B y + C = 0 Ax + By + C = 0 Ax+By+C=0
已知两直线一般表达式,求交点坐标
推导过程
假设已知两条之间的一般式方程
{
a
1
x
+
b
1
y
+
c
1
=
0
a
2
x
+
b
2
y
+
c
2
=
0
\begin{equation} \begin{cases} a_1 x + b_1y + c_1 = 0 \\ a_2 x + b_2y + c_2 = 0 \\ \end{cases} \end{equation}
{a1x+b1y+c1=0a2x+b2y+c2=0
将其中一条直线表示为点斜式的形式(这里以第一条直线为例)
a
1
x
+
b
1
y
+
c
1
=
0
b
1
y
=
(
−
a
1
x
−
c
1
)
y
=
−
a
1
x
−
c
1
b
1
\begin{equation} \begin{split} a_1 x + b_1y + c_1 &= 0 \\ b_1y &= (-a_1x - c_1) \\ y &= \frac{-a_1x - c_1}{b_1} \end{split} \end{equation}
a1x+b1y+c1b1yy=0=(−a1x−c1)=b1−a1x−c1
将其代入到另一条直线的方程中,解出两条直线交点的x坐标
a
2
x
+
b
2
y
+
c
2
=
0
a
2
x
+
b
2
(
−
a
1
x
−
c
1
)
b
1
+
c
2
=
0
a
2
b
1
x
+
b
2
(
−
a
1
x
−
c
1
)
+
b
1
c
2
=
0
a
2
b
1
x
−
a
1
b
2
x
−
b
2
c
1
+
b
1
c
2
=
0
a
2
b
1
x
−
a
1
b
2
x
=
b
2
c
1
−
b
1
c
2
x
=
b
2
c
1
−
b
1
c
2
a
2
b
1
−
a
1
b
2
\begin{equation} \begin{split} a_2 x + b_2y + c_2 &= 0 \\ a_2 x + b_2\frac{(-a_1x - c_1)}{b_1} + c_2 &= 0 \\ a_2 b_1 x + b_2(-a_1x - c_1) + b_1c_2 &= 0 \\ a_2 b_1 x -a_1b_2x - b_2c_1 + b_1c_2 &= 0 \\ a_2 b_1 x -a_1b_2x &= b_2c_1 - b_1c_2 \\ x &= \frac{b_2c_1 - b_1c_2}{a_2 b_1 -a_1b_2} \\ \end{split} \end{equation}
a2x+b2y+c2a2x+b2b1(−a1x−c1)+c2a2b1x+b2(−a1x−c1)+b1c2a2b1x−a1b2x−b2c1+b1c2a2b1x−a1b2xx=0=0=0=0=b2c1−b1c2=a2b1−a1b2b2c1−b1c2
同理可将
x
x
x的解析式写出
a
1
x
+
b
1
y
+
c
1
=
0
a
1
x
=
−
b
1
y
−
c
1
x
=
−
b
1
y
−
c
1
a
1
\begin{equation} \begin{split} a_1 x + b_1y + c_1 &= 0 \\ a_1 x &= -b_1y - c_1 \\ x &= \frac{-b_1y - c_1}{a_1} \\ \end{split} \end{equation}
a1x+b1y+c1a1xx=0=−b1y−c1=a1−b1y−c1
将
x
x
x回代,可得到
y
y
y的表达式如下
a
2
x
+
b
2
y
+
c
2
=
0
a
2
(
−
b
1
y
−
c
1
)
a
1
+
b
2
y
+
c
2
=
0
a
2
(
−
b
1
y
−
c
1
)
+
a
1
b
2
y
+
a
1
c
2
=
0
−
a
2
b
1
y
−
a
2
c
1
+
a
1
b
2
y
+
a
1
c
2
=
0
(
a
1
b
2
−
a
2
b
1
)
y
=
a
2
c
1
−
a
1
c
2
y
=
a
2
c
1
−
a
1
c
2
a
1
b
2
−
a
2
b
1
\begin{equation} \begin{split} a_2 x + b_2y + c_2 &= 0 \\ a_2 \frac{(-b_1y - c_1)}{a_1} + b_2y + c_2 &= 0 \\ a_2(-b_1y - c_1) + a_1b_2y + a_1c_2 &= 0 \\ -a_2b_1y - a_2c_1 + a_1b_2y + a_1c_2 &= 0 \\ (a_1b_2 - a_2b_1)y &= a_2c_1 - a_1c_2 \\ y &= \dfrac{a_2c_1 - a_1c_2}{a_1b_2 - a_2b_1} \\ \end{split} \end{equation}
a2x+b2y+c2a2a1(−b1y−c1)+b2y+c2a2(−b1y−c1)+a1b2y+a1c2−a2b1y−a2c1+a1b2y+a1c2(a1b2−a2b1)yy=0=0=0=0=a2c1−a1c2=a1b2−a2b1a2c1−a1c2
结果验证
以下用两个已知直线来验证结果
{
y
=
x
+
1
y
=
−
x
+
2
\begin{equation} \begin{cases} y = x + 1 \\ y = -x + 2 \end{cases} \end{equation}
{y=x+1y=−x+2
将它们改写为一般式则为
{
x
−
y
+
1
=
0
−
x
−
y
+
2
=
0
\begin{equation} \begin{cases} x -y + 1 = 0 \\ -x - y+ 2 = 0 \end{cases} \end{equation}
{x−y+1=0−x−y+2=0
用matlab程序来验证结果
syms a1 x b1 y c1 a2 b2 c2
f1 = a1*x + c1;
f2 = a2*x + c2;
x = 0:0.1:2
a1 = 1;
b1 = -1;
c1 = 1;
a2 = -1 ;
b2 = -1 ;
c2 = 2;
y1 = eval(f1);
y2 = eval(f2);
figure
plot(x,y2);hold on
plot(x,y1)
cross_x = (b2*c1 - b1*c2)/(a2*b1 - a1*b2)
cross_y =(a2*c1 - a1*c2)/(a1*b2 - a2*b1)
函数的封装验证
为了使用方便,将其用C++进行封装
template<class T>
pair<T,T> getLineCrossPoint(const T &a1, const T &b1, const T &c1,
const T &a2, const T &b2, const T &c2){
// 处理两条线平行或重合的情况
if(a1*b2 - a2*b1 == 0){
return make_pair<T, T>(-1, -1);$
}
T cross_x = (b2*c1 - b1*c2) / (a2*b1 - a1*b2);
T cross_y = (a2*c1 - a1*c2) / (a1*b2 - a2*b1);
// cross_x与cross_y是右值引用,因此需要使用move()将其改为左值引用
return make_pair<T, T>(move(cross_x), move(cross_y));
}
int main() {
auto ans = getLineCrossPoint(1.0, -1.0, 1.0, -1.0, -1.0, 2.0);
cout<< ans.first <<", "<<ans.second<<endl;
return 0;
}
点斜式
y
−
y
0
=
k
(
x
−
x
0
)
y - y_0 = k(x - x_0)
y−y0=k(x−x0)
其中
M
(
x
0
,
y
0
)
M(x_0,y_0)
M(x0,y0)是直线上的一点,
k
k
k是直线的斜率
斜截式
y
=
k
x
+
b
y = kx + b
y=kx+b
其中,
k
k
k为直线的斜率,
b
b
b是直线在y轴上的截距
两点式
y
−
y
1
y
2
−
y
1
=
x
−
x
1
x
2
−
x
1
(
y
1
≠
y
2
)
\dfrac{y-y_1}{y_2-y_1} = \dfrac{x - x_1}{x_2 - x_1} (y_1 \neq y_2)
y2−y1y−y1=x2−x1x−x1(y1=y2)
其中,
M
1
(
x
1
,
y
1
)
M1(x_1,y_1)
M1(x1,y1)和
M
2
(
x
2
,
y
2
)
M_2(x_2,y_2)
M2(x2,y2)分别为直线上的不同两点
截距式
x
a
+
y
b
=
1
\frac xa + \frac yb = 1
ax+by=1
其中
a
a
a和
b
b
b分别为直线在x轴、y轴上的截距(
a
≠
0
,
b
≠
0
a \neq 0, b \neq 0
a=0,b=0)