2020.04.12
一道面向数学的编程题目。对于一些数学问题的编程算法可以有进一步的理解。
本题主要是区分4种情况:
- 两条斜率都不存在,即与y轴平行
- 其中一条斜率不存在
- 直线1是垂线,直线2不是
- 直线2是垂线,直线1不是
- 两条都不是垂线
- 斜率相同,且截距相同并有交点
- 斜率不同,先算出交点,再看交点是否均在两条线段之间
基本方法:
- 判断线段有无交点的经典写法。
max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1])
。 - 判断点是否位于线段上的写法:
(y-start2[1])*(y-end2[1])<=0
编码时的坑:
- python2的除法系统有问题,最好还是用py3,今后代码都会在py3完成。
- 如果取值可能为0,就不要用
if k1:
这种方式进行判断,因为k==0
时候也无法进入循环。
代码如下:
class Solution:
def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]:
if start1[0] == end1[0]:
k1 = None
b1 = None
else:
k1 = (start1[1]-end1[1])/(start1[0]-end1[0])
b1 = start1[1]-k1*start1[0]
if start2[0] == end2[0]:
k2 = None
b2 = None
else:
k2 = (end2[1]-start2[1])/(end2[0]-start2[0])
b2 = start2[1]-k2*start2[0]
if k1 is None and k2 is None:
if start1[0] == start2[0] and max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1]):
return [start1[0], max(min(start1[1], end1[1]), min(start2[1], end2[1]))]
elif k1 is None:
y = k2*start1[0]+b2
if (y-start1[1])*(y-end1[1])<=0:
return [start1[0], y]
elif k2 is None:
y = k1*start2[0]+b1
if (y-start2[1])*(y-end2[1])<=0:
return [start2[0], y]
elif k1 == k2:
if b1 == b2 and max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1]):
return [max(min(start1[0], end1[0]),min(start2[0], end2[0])), max(min(start1[1], end1[1]),min(start2[1], end2[1]))]
elif k1!=k2:
x = (b1-b2)/(k2-k1)
y = k1*x+b1
if (x-start1[0])*(x-end1[0])<=0 and (x-start2[0])*(x-end2[0])<=0:
return [x,y]
return []