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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1086 线段相交

發布時間:2024/2/28 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1086 线段相交 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這個題目就是基本的線段相交水題。

并且重復點竟然算2個,哪沒辦法了,水過,線段相交,跨立實驗。

如何判斷兩條線段是否相交
判斷兩條線段是否相交?


(1) 快速排斥試驗
  設以線段 P1P2 為對角線的矩形為 R , 設以線段 Q1Q2 為對角線的矩形為 T ,如果 R 和 T?
不相交,顯然兩線段不會相交。
(2) 跨立試驗
  如果兩線段相交,則兩線段必然相互跨立對方。若 P1P2 跨立 Q1Q2 ,則矢量 ( P1 - Q1 ) 和
? ? ? ( P2 - Q1 ) 位于矢量 ( Q2 - Q1 ) 的兩側,
? ? ? 即 ( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0 。
? ? ? ?上式可改寫成 ( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0 。
? ? ? 當 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 時,說明 ( P1 - Q1 ) 和 ( Q2 - Q1 ) 共線,
? ? ? 但是因為已經通過快速排斥試驗,所以 P1 一定在線段 Q1Q2 上;
? ? ? 同理, ( Q2 - Q1 ) ×(P2 - Q1 ) = 0 說明 P2 一定在線段 Q1Q2 上。
? ? ?所以判斷 P1P2 跨立 Q1Q2 的依據是:?
? ? ? ( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0 。
? ? ? 同理判斷 Q1Q2 跨立 P1P2 的依據是:
? ? ? ( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0 。



代碼如下:

#include<cstdio> #include<cstring> #include<iostream> using namespace std; const double eps=1e-10; const int maxn=500; struct point{double x,y; }; point p[maxn],b[maxn]; bool ans[maxn]; double min(double a,double b) {return a < b ? a : b; } double max(double a,double b) {return a > b ? a : b; } bool inter(point a, point b, point c, point d){if( min(a.x, b.x) > max(c.x, d.x) ||min(a.y, b.y) > max(c.y, d.y) ||min(c.x, d.x) > max(a.x, b.x) ||min(c.y, d.y) > max(a.y, b.y) )return 0;double h, i, j, k;h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);//叉積i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);return h * i <= eps && j * k <= eps; } int main() {int n;while(scanf("%d",&n),n){int i,j;for(i=0;i<n;i++){scanf("%lf %lf",&p[i].x,&p[i].y);scanf("%lf %lf",&b[i].x,&b[i].y);}int ans=0;for(i=0;i<n;i++)for(j=i+1;j<n;j++){if(inter(p[i],b[i],p[j],b[j])) ans++;}printf("%d\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的hdu 1086 线段相交的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。