图形几何——直线:直线的表达式

直线的表达式

一般式

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=(a1xc1)=b1a1xc1
将其代入到另一条直线的方程中,解出两条直线交点的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(a1xc1)+c2a2b1x+b2(a1xc1)+b1c2a2b1xa1b2xb2c1+b1c2a2b1xa1b2xx=0=0=0=0=b2c1b1c2=a2b1a1b2b2c1b1c2
同理可将 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=b1yc1=a1b1yc1
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(b1yc1)+b2y+c2a2(b1yc1)+a1b2y+a1c2a2b1ya2c1+a1b2y+a1c2(a1b2a2b1)yy=0=0=0=0=a2c1a1c2=a1b2a2b1a2c1a1c2

结果验证

以下用两个已知直线来验证结果
{ 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} {xy+1=0xy+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) yy0=k(xx0)
其中 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) y2y1yy1=x2x1xx1(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)

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值