Leetcode 面试题16.03 - 交点

这篇博客介绍了如何解决LeetCode面试题16.03 - 交点的问题。通过平面几何法和向量法详细讲解了如何计算两条线段的交点,包括如何表示直线、计算交点、判断点在线段范围内,以及如何利用向量判断线段相交和求交点的方法。示例中给出了具体的算法实现思路。
摘要由CSDN通过智能技术生成

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}

首先,确定思路:

Created with Raphaël 2.2.0 输入 判断是否平行 判断是否重合 取最小重合点 退出 计算直线交点 判断交点是否在线段内 取交点 yes no yes no yes no

1 平面几何法

学过初中数学的人都会认为:啊,简单!但很快你就会发现并不是那么回事,需要考虑的情况很多。

从数学角度,我们可以比较轻松的得到上述的流程图,但是从代码实现的角度我们必须要考虑到几个重要的问题:

1.1 如何表示点在直线上

数学理论知识告诉我们,一条直线可以表示为:
y = k x + b 或 a x + b y + c = 0 y = kx + b \quad 或 \quad ax + by + c = 0 y=kx+bax+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(x2x1),y=y1+t(y2y1)

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(x2x1),y=y1+t1(y2y1)

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(x4x3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值