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

背景介绍

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

两点确定直线

表达式定义

??空间直线的表达式有多种,比如一般式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
    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}}}

两条直线的交点

表达式定义

??在已知直线两点的情况下,利用上面的直线一般式可以求得直线的参数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):
    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,符合数学计算。部分内容参考自两条线段是否相交,计算交点公式

时间: 2024-07-30 00:40:33

编程求取直线一般式表达式,两直线交点的相关文章

Fermat Point in Quadrangle(hdu 3694 求两直线交点

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3694 画几个图应该就可以知道凸四边形就是对角线交点 凹四边形就是凹进去的那个点 so 只要枚举四个点以及对角线交点 找个minn就可以 求两直线交点模板: double cross(double x1,double y1,double x2,double y2) { return x1*y2-x2*y1; } bool getcross(double x1,double y1,double x2,d

三维空间两直线/线段最短距离、线段计算算法 【转】

https://segmentfault.com/a/1190000006111226 d(ls,lt)=|sj−tj|=|s0−t0+(be−cd)u? −(ae−bd)v? ac−b d(ls,lt)=|sj−tj|=|s0−t0+(be−cd)u? −(ae−bd)v? ac−b2| 具体实现代码如下(C#实现): public bool IsEqual(double d1, double d2) { if (Math.Abs(d1 - d2) < 1e-7) return true; r

二维数组和最大字数组求取 2

题目: 返回一个二维数组的和最大字数组的和 要求: 随机生成二维数组,要求数组元素有正有负 二维数组首尾相连 数组中连续的n(n>=1)元素组成数组的字数组 源代码: import java.util.Random; import java.util.Scanner; public class erweixunhuanzishuzu { public static void main(String[] args) { //产生随机数组 int array[][] = new int[1000][

求取圆形区域内的平均灰度值

#include <cmath> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; const int kvalue = 15;//双边滤波邻域大小 const double PI = 3.14;//圆周率 int graylevel(Mat image, Mat dst, Point cen, int r)//求取圆形区域内的平均灰度值 { int graysum = 0, n = 0;

递归算法——求取斐波那契数列(2)

import java.util.Scanner; /** * Created by Administrator on 14-5-13. * 改进的计算斐波那契数列的方法,利用参数,经过测试运行时间会成倍减少 测试数据n=40 * 尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积. * 尾部递归是一种编程技巧.递归函数是指一些会在函数内调用自己的函数, * 如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归. * 尾部递归的函数有助将算法转化成函数编程语言,

linux系统之shell编程-正則表達式

shell编程正則表達式: 1:元字符   [ ]  .   *  ? + ( )  |  {  }  ^  $ 2 : [a-z0-9]  表示匹配随意数字和字母的一个 3 :  [^a-z]     匹配除了字母的随意一个 4 :  ab+c      +表示匹配一个或多个+号前面的字符 5 :   ab*c       *表示匹配没有或多个*号前面的字符 6 :   ab?c      ?表示匹配一个?号前面的字符 7 :   (ab){2}c   表示匹配两个ab字符的字符. 8 :  

UVa 11168(凸包、直线一般式)

要点 找凸包上的线很显然 但每条线所有点都求一遍显然不可行,优化方法是:所有点都在一侧所以可以使用直线一般式的距离公式\(\frac{|A* \sum{x}+B* \sum{y}+C*n|}{\sqrt {A^2+B^2}}\)\(O(1)\)算出总距离 #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #i

算法学习:后缀数组 height的求取

[定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表示的是,第 i 个后缀和字符串的最长前缀  [解决问题] 这两个算法都是在解决这个问题 即求后缀和字符串和后缀之间的最长公共前缀 但是有所不同的是, 后缀数组最终求出的是,字典序第 i 个后缀和第 i + 1 个后缀的最长公共前缀 z函数最终求出的是,第 i 个后缀和字符串的最长公共前缀 然后通过这个最长公共前缀求一些其他

线性时间求取第 K 大数

求 Top K 的算法主要有基于快速排序的和基于堆的这两种,它们的时间复杂度都为 \(O(nlogK)\).借助于分治思想,以及快速排序的区间划分,我们可以做到 \(O(n)\) 时间复杂度.具体算法思路如下: 第 1 步,我们将原数据 5 个一组划分为若干个组,最后余下的不足 5 个的额外作为一组,总组数为 \(g=\lceil{n/5}\rceil\): 第 2,3 步, 对每一个组内的 5 个元素利用插入排序算法进行排序,然后将每个组的中位数依次放到数据的前面,最后 \(A[0, g-1]