題目:
本來想用斜率來算,後來覺得要分太多情況,上網發現用快速排斥+跨立就能做
快速排斥的意思是當兩條線段分別構成的矩形範圍沒有相交,那麼兩直線肯定沒沒有交點,如下圖
如何判斷兩個矩形相交?一種錯誤的思路是乙個矩形中的點在另乙個矩形裡,單如果是十字相交的矩形就不成立
我的方法是找到兩個矩形的中心點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...