python3 题解(49 已知两直线求交点)

本文介绍了如何使用Python3编程求解两直线的交点。当给定两组直线坐标时,通过解决二元一次方程组找到交点坐标。如果两直线平行则无解。解决方案包括了平行线的判断和实际的计算过程。

两直线交点

【问题】两点确定一条直线。两直线只要不平行,就一定有唯一的交点。
请编程,输入两组两点的坐标,求这两条直线的交点坐标。

两点(x0,y0) (x1,y1) 所确定的直线形式为 ax + by = c
需要用点坐标来确定参数 a, b, c 的值。实际上有效的信息是两个值。因为上面的方程同时放大一定的倍数仍然成立。这样,(a,b,c)是一组解,不是一个。求出任意一个即可。

点坐标代入,解二元一次方程得:
a=y1−y0b=x0−x1c=x0y1−y0x1 \begin{aligned} &a = y_1 - y_0 \\ &b = x_0 - x_1 \\ &c = x_0 y_1 - y_0 x_1 \end{aligned} a=y1y0b=x0x1c=x0y1y0x1
这样,两条直线分别求出了系数 a, b, c, 得方程组:
a0x+b0y=c0a1x+b1y=c1 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)))

实际上的无解有两种情况。

  1. 由两个点确定一条直线时,给定的两个点重合,导致求直线时,a,b,c 的值全为零。
  2. 两条直线平行

需要补基础的,可以看:小甲鱼pyhthon教程,Bilibili站上还有:[耿老师]小甲鱼python作业 解析系列,持续更新中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值