一个并不复杂的数学问题:由两个点计算直线方程

2023-08-26 15:03:13 浏览数 (2)

问题很简单,就是输入两个点的坐标,返回一个直线方程的参数,原来的实现:

代码语言:javascript复制
def fit_line(p1, p2):
    """直线一般方程
    AX BY C=0
    :param p1, p2: 两点的坐标
    :return A, B, C
    """
    x1, y1 = p1
    x2, y2 = p2
    if abs(x1-x2) >= abs(y1-y2):   # y = ax   b
        a = (y1-y2) / (x1-x2)
        b = y1 - a * x1
        return a, -1, b

    # x = ay   b
    a = (x1-x2) / (y1-y2)
    b = x1 - a * y1
    return 1, -a, -b

这个函数是要返回直线的一般方程:ax by c=0,实现的时候注意到了x=c或者y=c这类特殊的直线,所以实现的时候才有了if分支判断。

这个实现没什么问题,不过就是看着别扭,计算一个直线方程,居然要加上分支判断,直觉告诉我应该是有更加简洁的计算公式。

拿起笔计算一下:

上图在计算a和b的时候,并不严谨,不过我们只需要计算一组值。

有了这个,实现就简单了:

代码语言:javascript复制
def fit_line(p1, p2):
    """直线一般方程
        AX BY C=0
    :param p1, p2: 两点的坐标
    :return A, B, C
    """
    x1, y1 = p1
    x2, y2 = p2
    A = y2 - y1
    B = x1 - x2
    C = x2 * y1 - x1 * y2
    return A, B, C

其实很简单。

问题是:作为数学专业毕业的,以前怎么没有想到这点呢?估计陷到了x=c和y=c这两种特殊情况里去了,被分母不能为零绊住了,但是其实只要稍微拿起笔计算一下,问题就迎刃而解了。

0 人点赞