编程求取直线一般式表达式,两直线交点

背景介绍

  最近在水面无人艇(USV)模拟仿真中,用到了一些点和线的关系求解,本文主要讲述一下两点确认直线,点到直线距离,两条直线的交点等问题的解决方法,并给出python程序。部分内容非原创,文中给出链接,需要者可以参考。   博客更新可参见github点线关系

两点确定直线

表达式定义

  空间直线的表达式有多种,比如一般式Ax+By+C=0、点斜式y-y0=k(x-x0)、截距式x/a+y/b=1、两点式:(y-y1)/(y1-y2)=(x-x1)/(x1-x2)等,它们具有彼此的约束条件,如下所示。

  由上可以看出来,一般式的适用范围最广,不需要单独做处理和判断,所以在计算机领域处理二维图像数据中一般式用的最多。   已知直线上的两点P1(X1,Y1)和P2(X2,Y2),P1和P2两点不重合,对于AX+BY+C=0,则有:

  • A=Y2-Y1
  • B=X1-X2
  • C=X2*Y1-X1*Y2

推导两点求直线的一般式方程的链接

python源代码

def GeneralEquation(first_x,first_y,second_x,second_y):
    # 一般式 Ax+By+C=0
    # from http://www.cnblogs.com/DHUtoBUAA/
    A=second_y-first_y
    B=first_x-second_x
    C=second_x*first_y-first_x*second_y
    return A,B,C

点到直线距离

表达式定义

  设直线L的方程为Ax+By+C=0,点P的坐标为(x0,y0),则点P到直线L的距离为:

d=\frac{\left | A\times x0+B\times y0+C \right |}{\sqrt{A^{2}+B^{2}}}

  博客园对Markdown插入数学公式支持不友好,可以转移到看github点线关系查看最新版。如果有博客园数学公式插入方法,欢迎留言指教。

两条直线的交点

表达式定义

  在已知直线两点的情况下,利用上面的直线一般式可以求得直线的参数A、B和C,那么两条直线的一般式表达可以列成二元一次方程组,其解即为两条直线的交点坐标。注意处理两条直线平行的特殊情况。

  根据二元一次方程的解,假设两条直线的参数分别为A1,B1,C1和A2,B2,C2,那么两条直线的交点可以表示为:

x=\frac{C2\times B1-C1\times B2}{A1\times B2-A2\times B1}

y=\frac{C1\times A2-C2\times A1}{A1\times B2-A2\times B1}

python源代码

def GetIntersectPointofLines(x1,y1,x2,y2,x3,y3,x4,y4):
    # from http://www.cnblogs.com/DHUtoBUAA/
    A1,B1,C1=GeneralEquation(x1,y1,x2,y2)
    A2, B2, C2 = GeneralEquation(x3,y3,x4,y4)
    m=A1*B2-A2*B1
    if m==0:
        print("无交点")
    else:
        x=(C2*B1-C1*B2)/m
        y=(C1*A2-C2*A1)/m
    return x,y

  程序运行结果:两直线交点为x=32.857142857142854,y=65.71428571428571,符合数学计算。部分内容参考自两条线段是否相交,计算交点公式

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏wym

opencv学习笔记 高斯模糊

高斯平滑函数GaussianBlur():定义:GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, ...

651
来自专栏CVPy

OpenCV 玩九宫格数独(二):knn 数字识别

我们现在要做的是要识别从九宫格图片中提取出来的印刷体的数字。本文从零开始做一遍数字识别,展示了数字识别的完整流程。从收集数据开始,到数据预处理,再到训练KNN,...

1.9K2
来自专栏CVer

TensorFlow从入门到精通 | 01 简单线性模型(上篇)

[TensorFlow从入门到精通] 01 简单线性模型(上)介绍了TensorFlow如何加载MNIST、定义数据维度、TensorFlow图、占位符变量和O...

632
来自专栏闪电gogogo的专栏

IEEE Trans 2008 Gradient Pursuits论文学习

之前所学习的论文中求解稀疏解的时候一般采用的都是最小二乘方法进行计算,为了降低计算复杂度和减少内存,这篇论文梯度追踪,属于贪婪算法中一种。主要为三种:梯度(gr...

1869
来自专栏菩提树下的杨过

机器学习笔记(3):多类逻辑回归

仍然是 动手学尝试学习系列的笔记,原文见:多类逻辑回归 — 从0开始 。 这篇的主要目的,是从一堆服饰图片中,通过机器学习识别出每个服饰图片对应的分类是什么(比...

3358
来自专栏小小挖掘机

windows下使用word2vec训练维基百科中文语料全攻略!(三)

训练一个聊天机器人的很重要的一步是词向量训练,无论是生成式聊天机器人还是检索式聊天机器人,都需要将文字转化为词向量,时下最火的词向量训练模型是word2vec,...

3175
来自专栏Spark学习技巧

SparkMllib主题模型案例讲解

一 本文涉及到的算法 1, LDA主题模型 符号定义 文档集合D,m篇,topic集合T,k个主题 D中每个文档d看作一个单词序列< w1,w2,...,wn...

2155
来自专栏杨熹的专栏

TensorFlow-1: 如何识别数字

数字识别是机器学习领域中一个经典的问题,是一个看似对人类很简单却对程序十分复杂的问题。识别数字在机器学习任务中的地位和 Hello World 在编程中是一样的...

8350
来自专栏PPV课数据科学社区

[SAS代码模板]抽样_surveyselect

SAS抽样代码模板 黄色部分为套用部分,红色部分为可选部分 ——————————模板—————————— proc surveyselect data=总体数据...

2609
来自专栏超智能体

YJango:TensorFlow高层API Custom Estimator建立CNN+RNN的演示

该文是YJango:TensorFlow中层API Datasets+TFRecord的数据导入的后续。

7797

扫描关注云+社区