必威体育Betway必威体育官网
当前位置:首页 > IT技术

判断线段是否相交:快速排斥+跨立

时间:2019-09-29 12:15:30来源:IT技术作者:seo实验室小编阅读:65次「手机版」
 

跨立

矢量

如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量p2

矢量的加减

设二维矢量 P = (x1, y1), Q = (x2, y2),则 P + Q = (x1 + x2, y1 + y2), P -Q = (x1 - x2, y1 - y2),且有 P + Q = Q + P, P - Q = -(Q - P)

矢量叉积

设矢量 P = (x1, y1), Q = (x2, y2),则 P * Q = x1 * y2 - x2 * y1; 其结果是一个由(0, 0), P, Q, P + Q 所组成的平行四边形的 带符号的面积,P * Q = -(Q * P), P * (- Q) =-(P * Q)

叉积的一个非常重要的性质是可以通过它的符号来判断两矢量相互之间的顺逆时针关系:

若 P * Q > 0,则 P 在 Q 的顺时针方向

若 P * Q < 0, 则 P 在 Q 的逆时针方向

若 P * Q = 0,则 P 与 Q 共线,但不确定 P, Q 的方向是否相同

折线段的拐向判断

如图,假设有折线段 p0p1p2 ,要确定 p1p2 相对于 p0p1 是向左拐还是向右拐,可以通过计算(p2 - p0)*(p1 -p0) 的符号来确定折线的拐向(点 p2 - p0 实际上就是向量 p2,但这里要注意线段和矢量的区别)

判断点是否在线段上

设点 Q = (x, y), P1 = (x1, y1), P2 = (x2, y2),若 (Q - P1)*(P2 - P1) =0 且 min(x1, x2) <= x <= max(x1, x2) && min(y1, y2)<= y <= max(y1, y2),则点 Q 在线段 P1P2 上

判断两线段是否相交

1)快速排斥试验

设以线段 P1P2 为对角线的矩形为 R,设以线段 Q1Q2 为对角线的矩形为 T,若 R、T 不相交,则两线段不可能相交

假设 P1 = (x1, y1), P2 = (x2, y2), Q1 = (x3, y3), Q2 = (x4, y4),设矩形 R的 x 坐标的最小边界为 minRX = min(x1, x2),以此类推,将矩形表示为 R = (minRX, minRY,maxRX, maxRY) 的形式,若两矩形相交,则相交的部分构成了一个新的矩形 F,如图所示,我们可以知道 F 的 minFX =max(minRX, minTX), minFY = max(minRY, minTY), maxFX = min(maxRX,maxTX), maxFY = min(maxRY, maxTX),得到 F 的各个值之后,只要判断矩形 F 是否成立就知道 R 和T 到底有没有相交了,若 minFX > maxFX 或 minFY > maxFy 则 F 无法构成,RT不相交,否则RT相交

2)跨立试验

若 P1P2 跨立 Q1Q2,则 P1,P2 分别在 Q1Q2 所在直线的两端,则有 (P1 - Q1)*(Q2 - Q1) *(Q2 - Q1)*(P2 - Q1) > 0,当 (P1 - Q1)*(Q2 - Q1) = 0 时,说明 (P1 - Q1)与 (Q2 - Q1) 共线,但由于已经经过快速排斥试验,所以 Q1 必为 P1P2 与 Q1Q2的交点,依然满足线段相交的条件,则跨立试验可改为:

当 (P1 - Q1)*(Q2 - Q1) * (Q2 - Q1)*(P2 - Q1) >= 0,则 P1P2 跨立Q1Q2,当 Q1Q2 也跨立 P1P2 的时候,则 P1P2 相交

(注意式子中被隔开的 * 代表两个叉积的值的相乘,而另外的两个 * 则代表计算矢量叉积)

转自:http://blog.sina.com.cn/s/blog_71dbfe2e0101f7zb.html

相关阅读

大学生是否可以去兼职做老师呢?

举一个非常普遍的例子,现在的大学生兼职中是不是有非常多的去做家教老师的呢?所以,大学生去兼职做老师是有这个资本的。对于现在的

大端和小端的含义及判断代码

1、概述 在计算机系统中,数据都是以字节进行存储的,每个地址单元对应一个字节,每个字节都是8位(bit)。但是C++除了char和bool之外,还有

吾日三省吾身(一):身为产品经理,你是否有自省过呢?

作为产品经理,平时的工作其实是有点繁杂的,这就导致了很多产品经理缺少足够的时间去沉淀过去,因此趁着新年伊始工作还没有全面展开的

注册页面中用户名是否存在

注册页面中用户名是否存在(AJAX实现) 客户端:   失去焦点,执行功能   为输入框绑定onblur事件=function(){ 1.获得表单输入的用户

Scratch编程案例-根据三边关系判断是否为三角形

君子既知教之所由兴,又知教之所由废,然后可以为人师也。故君子之教,喻也。道而弗牵,强而弗抑,开而弗达。道而弗牵则和,强而弗抑则易,开而

分享到:

栏目导航

推荐阅读

热门阅读