问题很简单,就是输入两个点的坐标,返回一个直线方程的参数,原来的实现:
代码语言: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这两种特殊情况里去了,被分母不能为零绊住了,但是其实只要稍微拿起笔计算一下,问题就迎刃而解了。