此题解首先通过直线方程和线段端点位置关系判断两线段是否平行或共线。如果平行且共线,再判断线段是否有重叠部分,并选出最小的交点。如果不平行,使用线性方程组来找到潜在的交点,并检查该点是否同时在两条线段上。
时间复杂度: O(1)
空间复杂度: O(1)
class Solution:
def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]:
# Extract coordinates from the input
x1, y1 = start1
x2, y2 = end1
x3, y3 = start2
x4, y4 = end2
# Helper function to check if a point is within a segment
def inline(x1, y1, x2, y2, xk, yk):
return (min(x1, x2) <= xk <= max(x1, x2)) and (min(y1, y2) <= yk <= max(y1, y2))
ans = []
# Check parallelism
if (y4 - y3) * (x2 - x1) == (y2 - y1) * (x4 - x3):
# Check colinearity
if (y3 - y1) * (x2 - x1) == (y2 - y1) * (x3 - x1):
# Check if the segments overlap and find the smallest intersection point
if inline(x3, y3, x4, y4, x1, y1):
if not ans or ans > [x1, y1]:
ans = [x1, y1]
if inline(x3, y3, x4, y4, x2, y2):
if not ans or ans > [x2, y2]:
ans = [x2, y2]
if inline(x1, y1, x2, y2, x3, y3):
if not ans or ans > [x3, y3]:
ans = [x3, y3]
if inline(x1, y1, x2, y2, x4, y4):
if not ans or ans > [x4, y4]:
ans = [x4, y4]
else:
# Calculate potential intersection point using line equations
t1 = ((x1 - x3) * (y4 - y3) - (y1 - y3) * (x4 - x3)) / ((y2 - y1) * (x4 - x3) - (x2 - x1) * (y4 - y3))
t2 = ((x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1)) / ((y4 - y3) * (x2 - x1) - (y2 - y1) * (x4 - x3))
if 0 <= t1 <= 1 and 0 <= t2 <= 1:
ans = [x1 + t1 * (x2 - x1), y1 + t1 * (y2 - y1)]
return ans