两直线交点
【问题】两点确定一条直线。两直线只要不平行,就一定有唯一的交点。
请编程,输入两组两点的坐标,求这两条直线的交点坐标。
两点(x0,y0) (x1,y1) 所确定的直线形式为 ax + by = c
需要用点坐标来确定参数 a, b, c 的值。实际上有效的信息是两个值。因为上面的方程同时放大一定的倍数仍然成立。这样,(a,b,c)是一组解,不是一个。求出任意一个即可。
点坐标代入,解二元一次方程得:
a
=
y
1
−
y
0
b
=
x
0
−
x
1
c
=
x
0
y
1
−
y
0
x
1
begin{aligned} &a = y_1 - y_0 \ &b = x_0 - x_1 \ &c = x_0 y_1 - y_0 x_1 end{aligned}
a=y1−y0b=x0−x1c=x0y1−y0x1
这样,两条直线分别求出了系数 a, b, c, 得方程组:
a
0
x
+
b
0
y
=
c
0
a
1
x
+
b
1
y
=
c
1
a_0 x + b_0 y = c_0 \ a_1 x + b_1 y = c_1
a0x+b0y=c0a1x+b1y=c1
可得解为:
dd = a0 * b1 - b0 * a1
若 dd 为0, 则线平行
否则有解: x = (c0 * b1 - b0 * c1) / dd, y = (a0 * c1 - c0 * a1) / dd
这基本上就是一个纯数学的问题,用哪种语言描述没多大不同。
以下是 python 的解法:
### 两直线求交点
def lineCrossLine(p1, p2, q1, q2):
def pointAndPointToLine(pt0, pt1): ## 由两点得直线的标准方程 ax+by=c
x0, y0 = pt0
x1, y1 = pt1
return (y1-y0, x0-x1, x0 * y1 - y0 * x1)
a0,b0,c0 = pointAndPointToLine(p1,p2)
a1,b1,c1 = pointAndPointToLine(q1,q2)
dd = a0 * b1 - a1 * b0
if abs(dd) < 1e-6: return None
return ((c0 * b1 - c1 * b0) / dd, (a0 * c1 - a1 * c0) / dd)
if __name__ == '__main__':
print(lineCrossLine((0,0),(1,1),(0,1),(1,0)))
print(lineCrossLine((0,2),(3,0),(0,1),(2,3)))
print(lineCrossLine((0,2),(0,2),(0,1),(2,3)))
print(lineCrossLine((0,2),(3,0),(0,4),(6,0)))
print(lineCrossLine((1,2),(3,5),(1,2),(7,4)))
实际上的无解有两种情况。
- 由两个点确定一条直线时,给定的两个点重合,导致求直线时,a,b,c 的值全为零。
- 两条直线平行
需要补基础的,可以看:小甲鱼pyhthon教程,Bilibili站上还有:[耿老师]小甲鱼python作业 解析系列,持续更新中。
最后
以上就是愤怒世界最近收集整理的关于python3 题解(49 已知两直线求交点)两直线交点的全部内容,更多相关python3内容请搜索靠谱客的其他文章。
发表评论 取消回复