求两条线段的交点java_计算几何-求线段交点算法和代码(C++语言)

本文详细介绍了如何判断两条线段是否相交,并提供了C++代码实现。通过快速排斥实验和跨立实验判断相交,然后计算交点坐标。代码包括了线段的跨立判断和交点计算的函数。
摘要由CSDN通过智能技术生成

问题描述

问题描述:已知两条线段P1P2和Q1Q2,判断P1P2和Q1Q2是否相交,若相交,求出交点。

两条线段的位置关系可以分为三类:有重合部分、无重合部分但有交点、无交点。

0f369986bc33a5269e6c0683272315ab.png

算法核心

算法的步骤如下:

1.快速排斥实验。

设以线段P1P2为对角线的矩形为R,设以线段Q1Q2为对角线的矩形为T,如果R和T不相交,则两线段不相交。

所以P1P2和Q1Q2相交的必要条件是以他们为对角线的矩形相交,即:

min(p1.x,p2.x) <= max(q1.x,q2.x) &&

min(q1.x,q2.x) <= max(p1.x,p2.x) &&

min(p1.y,p2.y) <= max(q1.y,q2.y) &&

min(q1.y,q2.y) <= max(p1.y,p2.y);

2.跨立实验。

如果两线段相交,则两线段必然相互跨立对方。

线段的跨立究竟是什么意思?向量的跨立是什么意思?

6b3a61b03e10115f446e8178edcbae58.png

a、若P1P2跨立Q1Q2,则矢量(P1-Q1)和(P2-Q1)位于矢量(Q2-Q1)的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。

等价于

(Q1.x-P1.x,Q1.y-P1.y) × ( Q1.x-Q2.x,Q1.y-Q2.y ) * ( Q1.x-P2.x,Q1.y-P2.y ) × ( Q1.x-Q2.x,Q1.y-Q2.y ) < 0

等价于

((Q1.x-P1.x)*(Q1.y-Q2.y)-(Q1.y-P1.y)*( Q1.x-Q2.x)) * ((Q1.x-P2.x)*(Q1.y-Q2.y)-(Q1.y-P2.y)*(Q1.x-Q2.x)) < 0

b、若Q1Q2跨立P1P2,则矢量(Q1-P1)和(Q2-P1)位于矢量(P2-P1)的两侧,即( Q1 - P1 ) × ( P2 - P1 ) * ( Q2 - P1 ) × ( P2 - P1 ) < 0。

等价于

(P1.x-Q1.x,P1.y-Q1.y) × ( P1.x-P2.x,P1.y-P2.y ) * ( P1.x-Q2.x,P1.y-Q2.y ) × ( P1.x-P2.x,P1.y-P2.y ) < 0

等价于

((P1.x-Q1.x)*(P1.y-P2.y)-(P1.y-Q1.y)*(P1.x-P2.x)) * ((P1.x-Q2.x)*(P1.y-P2.y)-(P1.y-Q2.y)*( P1.x-P2.x)) < 0

a和b两个不等式只要满足一个即可。

排斥实验和跨立实验的示例如下图所示。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值