線段相交(快速排斥和跨立)

2022-08-20 08:06:08 字數 1105 閱讀 3589

題目:

本來想用斜率來算,後來覺得要分太多情況,上網發現用快速排斥+跨立就能做

快速排斥的意思是當兩條線段分別構成的矩形範圍沒有相交,那麼兩直線肯定沒沒有交點,如下圖

如何判斷兩個矩形相交?一種錯誤的思路是乙個矩形中的點在另乙個矩形裡,單如果是十字相交的矩形就不成立

我的方法是找到兩個矩形的中心點c1,c2,設兩個矩形的寬和高分別為w1,h1,w2,h2

那麼只要滿|c1.x-c2.x|<=(w1+w2)/2 && |c1.y-c2.y|<=(h1+h2)/2就是相交

bool

mbr(rec a1,rec a2)

排除必然不相交的情況後再來看哪些情況相交,這裡用到跨立

跨立即一向量跨過另一向量,如下圖只需ac向量和ad向量在ab向量兩側,同時ca向量和cb向量在cd向量的兩側即可證明

怎麼實現在兩側?用向量叉乘(acxab)·(abxad)<=0即可說明ac與ad在ab兩側(要注意考慮重合的情況)

以下是完整**

#include#include

#include

using

namespace

std;

structp;

struct

vec;

struct

rec;

rec rectangle(p a1,p a2)

vec vector(p a1,p a2)

double

vec_pro(vec v1,vec v2)

bool

mbr(rec a1,rec a2)

intmain()

if(need_judge)

if(is_intersect)

cout

<

yes"

<

else

cout

<

線段交叉判斷(快速排斥實驗 跨立實驗)

第1 步 快速排斥試驗,如果分別以p1p2 p3p4 為對角線做矩形,而這兩個矩形不相交,則這兩條線段肯定不相交,如下左圖 即使兩個矩形相交,這兩條線段也不一定相交 如下右圖,這時再用第 2 步判斷 表示成語句,即兩個矩形相交當且僅當下列式子為真 max x1,x2 min x3,x4 max x3...

POJ 1127 跨立實驗和快速排斥實驗

還是那道題 但是這次有乙個全新的解法了,涉及到的跨立實驗和快速排斥實驗,在學習部分我有提及過。不多說直接上一下核心 直接進行雙實驗,如果快速排斥不通過 直接pass 之後再進行跨立實驗,如果成了 那麼兩直線相交 bool judge point p1,point p2,point q1,point ...

線段相交之精粹和交點問題

博主今天聽了一句話,感覺好有內涵。待你征服宇宙,給我乙個地球可好 線段相交 2016 5 16 include include include define def 1e 6 點struct point 直線 struct line int direction point pi,point pj,p...