JAVA判断直线与线段相交,判断两个线段是否相交

本文详细介绍了使用解方程法和外积法判断两条线段在二维平面上是否相交。解方程法需要考虑特殊情况,包括线段退化为点和平行的情况。外积法则通过计算向量的叉乘来判断,逻辑更简洁。两种方法均避免了除法操作,适用于高效计算。
摘要由CSDN通过智能技术生成

我们的问题是这样的:给定一条线段的起点为$A_1$、终点为$A_2$,另一条线段的起点为$B_1$、终点为$B_2$,问线段$A_1A_2$和线段$B_1B_2$是否相交?

我们首先解释一下,两条线段相交的概念是指,存在一个点,这个点同时在两条线段上。

方法一(解方程法):

容易知道,线段$A_1A_2$上的点的集合为$A = A_1 * (1 - r_1) + A_2 * r_1$,其中$r_1 \in [0, 1]$;同理,线段$B_1B_2$上的点的集合为$B = B_1 * (1 - r_2) + B_2 * r_2$,其中$r_2 \in [0, 1]$。一般的,如果不对$r_1$(或$r_2$)的范围作约束,得到的点集构成该线段所在的直线。那么这个问题就简单了,我们可以首先将两条线段延展成直线,求出两条直线的交点,根据交点位置可以分别求出$r_1$和$r_2$,然后判断$r_1$和$r_2$是否同时在$[0, 1]$区间即可。我们把$r_1$($r_2$)叫做点$A$($B$)在线段$A_1A_2$(线段$B_1B_2$)上的比例。

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

两直线的交点满足$A_1 * (1 - r_1) + A_2 * r_1 = B_1 * (1 - r_2) + B_2 * r_2$,稍微变形可得$(A_2 - A_1) * r_1 - (B_2 - B_1) * r_2 = B_1 - A_1$,即$$\overrightarrow{A_1A_2} * r_1 - \overrightarrow{B_1B_2} * r_2 = \overrightarrow{A_1B_1}$$,表示为向量矩阵的形式为(令$\overrightarrow{r} = (r_1, r_2)^T$):$$[\overrightarrow{A_1A_2}, - \overrightarrow{B_1B_2}] * \overrightarrow{r} = \overrightarrow{A_1B_1}$$

我们的目的是根据以上二元方程组求出$r_1$和$r_2$,但是在此之前,我们要判断一些特殊情况:

(1). 如果$\overrightarrow{A_1A_2} = \overrightarrow{0}$,即线段$A_1A_2$是一个点,这时,等式退化为$- \overrightarrow{B_1B_2} * r_2 = \overrightarrow{A_1B_1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值