Leetcode 面试题16.03 - 交点
给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。
要求浮点型误差不超过10^-6。若有多个交点(线段重叠)则返回 X 值最小的点,X 坐标相同则返回 Y 值最小的点。
示例:输入:line1 = {0, 0}, {1, 0} line2 = {1, 1}, {0, -1}
输出: {0.5, 0}
文章目录
首先,确定思路:
1 平面几何法
学过初中数学的人都会认为:啊,简单!但很快你就会发现并不是那么回事,需要考虑的情况很多。
从数学角度,我们可以比较轻松的得到上述的流程图,但是从代码实现的角度我们必须要考虑到几个重要的问题:
1.1 如何表示点在直线上
数学理论知识告诉我们,一条直线可以表示为:
y = k x + b 或 a x + b y + c = 0 y = kx + b \quad 或 \quad ax + by + c = 0 y=kx+b或ax+by+c=0
但是,明显我们不知道方程中的参数值,我们已知的信息只有直线上两个点的坐标。幸运的是,数学老师教过 两点确定一条直线,并且考虑到直线有垂直于x轴和垂直于y轴两种特殊情况,用 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1), (x_2,y_2) (x1,y1),(x2,y2) 表示一条直线上的两点,则直线可以表示为: x = x 1 + t ( x 2 − x 1 ) , y = y 1 + t ( y 2 − y 1 ) x = x_1 + t(x_2-x_1), y=y_1+t(y2-y1) x=x1+t(x2−x1),y=y1+t(y2−y1)
1.2 如何计算直线交点
仅考虑两直线相交的情况,用 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1), (x_2,y_2) (x1,y1),(x2,y2) 表示第一条直线上的两点, ( x 3 , y 3 ) , ( x 4 , y 4 ) (x_3,y_3) ,(x_4,y_4) (x3,y3),(x4,y4) 表示第二条直线上的两点。则有:
x = x 1 + t 1 ( x 2 − x 1 ) , y = y 1 + t 1 ( y 2 − y 1 ) x = x_1 + t_1(x_2-x_1), y=y_1+t_1(y2-y1) x=x1+t1(x2−x1),y=y1+t1(y2−y1)
x = x 3 + t 2 ( x 4 − x 3 ) , y = y 3 + t 2 ( y 4 − y 3 ) x = x_3 + t_2(x_4-x_3) ,y=y_3+t_2(y4-y3) x=x3+t2(x4−x3