#### 斜截式:y=kx+b【适用于不垂直于x轴的直线】
#### 参数方程式,它可以表示任意的直线,并且它非常适合用于表示线段。假设我们给定两个点 (x_1, y_1)(x1,y1) 以及 (x_2, y_2)(x2,y2),我们只需要令:
# x = x_1 + t(x_2 - x_1) and y = y_1 + t(y_2 - y_1)
#### 所以这道题的点就在于要用参数方程来求解。必须可以表示任意的直线~~
#### 当然我还是用斜截式,比较熟悉。所以要分是否与x轴垂直。 k = (y2 - y1) / (x2 - x1); 其实 一条与x垂直的话,那么其实就可以确定一个横坐标,那么可能的交点的纵坐标就可以求。然后再比较位置~不难
class Solution:
def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]:
start1, end1 = sorted([start1, end1], key=lambda x:(x[0], x[1]))
start2, end2 = sorted([start2, end2], key=lambda x:(x[0], x[1]))
if start1 == start2:
return start1
if start1[0] - end1[0] == 0:
x = start1[0]
y = start1[1]
else:
k1 = (start1[1] - end1[1]) / (start1[0] - end1[0])
b1 = start1[1] - k1 * start1[0]
if start2[0] - end2[0] == 0:
k2 = 0
else:
k2 = (start2[1] - end2[1]) / (start2[0] - end2[0])
b2 = start2[1] - k2 * start2[0]
if start1[0] == end1[0] and start2[0] == end2[0]:
## 都平行于x轴
if start1[0] != start2[0]:
return []
else:
if end2[1] >= start1[1] >= start2[1]:
return start1
if end2[1] >= end1[1] >= start2[1]:
return start2
return []
elif start1[0] == end1[0]:
### 一条平行于x轴
y2 = k2 * start1[0] + b2
if start1[1] <= y2 <= end1[1]:
return [start1[0], y2]
else:
return []
elif start2[0] == end2[0]:
### 一条平行于x轴
y1 = k1 * start2[0] + b1
if start2[1] <= y1 <= end2[1]:
return [start2[0], y1]
else:
return []
if k1 == k2 and b1 == b2:
if end1 < start2 or start1 > end2:
return []
else:
return max(start1, start2)
if k1 == k2:
return []
x = (b2-b1) / (k1-k2)
y = k1*x + b1
### 坑在这里,排序之后,X大的不一定y也是比较大。
# if end1[0] >= x >= start1[0] and end2[0] >= x >= start2[0] and (end1[1] >= y >= start1[1] or start1[1] >= y >= end1[1]) and (end2[1] >= y >= \
# start2[1] or start2[1] >= y >= end2[1]):
### 当然也可以不用这么麻烦,直接:
if (start2[1]-y)*(end2[1]-y)<=0 and (start1[1]-y)*(end1[1]-y)<=0:
return [x, y]
else:
return []