日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[51nod1264]线段相交

發(fā)布時(shí)間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [51nod1264]线段相交 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

給定兩個(gè)點(diǎn):

typedef? struct {

? double? x, y;

} Point;

Point A1,A2,B1,B2;

首先引入兩個(gè)實(shí)驗(yàn):

a.快速排斥實(shí)驗(yàn)

設(shè)以線段A1A2和線段B1B2為對角線的矩形為M,N;

若M,N 不相交,則兩個(gè)線段顯然不相交;

所以:滿足第一個(gè)條件時(shí):兩個(gè)線段可能相交。

?

b.跨立實(shí)驗(yàn)

?

如果兩線段相交,則兩線段必然相互跨立對方.若A1A2跨立B1B2,則矢量( A1 - B1 ) 和(A2-B1)位于矢量(B2-B1)的兩側(cè),

即(A1-B1) × (B2-B1) * (A2-B1) × (B2-B1)<0。

上式可改寫成(A1-B1) × (B2-B1) * (B2-B1) × (A2-A1)>0。

應(yīng)該判斷兩次,即兩條線段都要為直線,判斷另一直線的兩端點(diǎn)是否在它兩邊,若是則兩線段相交。

若積極滿跨立實(shí)驗(yàn)是不行的,如下面的情況:

?

即兩條線段在同一條直線上。所以我們要同時(shí)滿足兩次跨立和快速排斥實(shí)驗(yàn)。

?

總體分析:

當(dāng)(A1-B1) × (B2-B1)=0時(shí),說明(A1-B1)和(B2-B1)共線,但是因?yàn)橐呀?jīng)通過快速排斥試驗(yàn),所以 A1一定在線段 B1B2上;同理,(B2-B1)×(A2-B1)=0 說明A2一定在線段B1B2上。所以判斷A1A2跨立B1B2的依據(jù)是:(A1-B1) × (B2-B1) * (B2-B1) × (A2-B1) >= 0。

同理判斷B1B2跨立A1A2的依據(jù)是:(B1-A1) × (A2-A1) * (A2-A1) × (B2-A1) >= 0。

如圖:

?

應(yīng)用:

1.?????? 判斷兩個(gè)線段相交

2.?????? 判斷線段與直線相交

3.?????? 判斷點(diǎn)在矩形內(nèi)

?

模板題

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct line{ 5 double x1,y1,x2,y2; 6 }p,q; 7 double cross1(line &a,line &b){ 8 return (a.x1-b.x1)*(b.y2-b.y1)-(a.y1-b.y1)*(b.x2-b.x1); 9 } 10 double cross2(line &a,line &b){ 11 return (a.x2-b.x1)*(b.y2-b.y1)-(a.y2-b.y1)*(b.x2-b.x1); 12 } 13 bool judge(line &a,line &b){ 14 if(max(a.x1,a.x2)>=min(b.x1,b.x2)&& 15 max(a.y1,a.y2)>=min(a.y1,a.y2)&& 16 max(b.x1,b.x2)>=min(a.x1,a.x2)&& 17 max(b.y1,b.y2)>=min(a.y1,a.y2)&& 18 cross1(a,b)*cross2(a,b)<=0&& 19 cross1(b,a)*cross2(b,a)<=0) 20 return true; 21 return false; 22 } 23 int main(){ 24 int t; 25 cin>>t; 26 while(t--){ 27 cin>>p.x1>>p.y1>>p.x2>>p.y2>>q.x1>>q.y1>>q.x2>>q.y2; 28 if(judge(p,q)) cout<<"Yes\n"; 29 else cout<<"No\n"; 30 } 31 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/elpsycongroo/p/6914812.html

總結(jié)

以上是生活随笔為你收集整理的[51nod1264]线段相交的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。