1. 程式人生 > >51 Nod 1298 圓與三角形(計算幾何)

51 Nod 1298 圓與三角形(計算幾何)

tput body bits truct 大於 簡單 以及 else c++

題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298

題目:

1298 圓與三角形 給出圓的圓心和半徑,以及三角形的三個頂點,問圓同三角形是否相交。相交輸出"Yes",否則輸出"No"。(三角形的面積大於0)。 技術分享圖片 技術分享圖片 Input
第1行:一個數T,表示輸入的測試數量(1 <= T <= 10000),之後每4行用來描述一組測試數據。
4-1:三個數,前兩個數為圓心的坐標xc, yc,第3個數為圓的半徑R。(-3000 <= xc, yc <= 3000, 1 <= R <= 3000)
4-2:2個數,三角形第1個點的坐標。
4-3:2個數,三角形第2個點的坐標。
4-4:2個數,三角形第3個點的坐標。(-3000 <= xi, yi <= 3000)
Output
共T行,對於每組輸入數據,相交輸出"Yes",否則輸出"No"。
Input示例
2
0 0 10
10 0
15 0
15 5
0 0 10
0 0
5 0
5 5
Output示例
Yes
No
題解:模板題
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define PI acos(-1.0)
 5 #define INF 0x3f3f3f3f
 6 #define FAST_IO ios::sync_with_stdio(false)
 7 
 8 typedef long
long LL; 9 10 //點結構 11 struct point{ 12 double x,y; 13 }; 14 15 //兩點之間距離 16 double dis(point p1,point p2){ 17 return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); 18 } 19 20 //判斷線段是否和圓相交,這個是點p1和p2都不在圓內的情況。 21 //其他的判斷很簡單的,單獨判斷一下即可。 22 bool check(point p1,point p2,point O,double
r){ 23 double a,b,c,dis1,dis2,angle1,angle2; 24 if(p1.x==p2.x){ 25 a=1;b=0;c=-p1.x; 26 } 27 else if(p1.y==p2.y){ 28 a=0;b=1;c=-p1.y; 29 } 30 else{ 31 a=p1.y-p2.y; 32 b=p2.x-p1.x; 33 c=p1.x*p2.y-p1.y*p2.x; 34 } 35 dis1=a*O.x+b*O.y+c; 36 dis1*=dis1; 37 dis2=(a*a+b*b)*r*r; 38 if(dis1>dis2) return false; 39 angle1=(O.x-p1.x)*(p2.x-p1.x)+(O.y-p1.y)*(p2.y-p1.y); 40 angle2=(O.x-p2.x)*(p1.x-p2.x)+(O.y-p2.y)*(p1.y-p2.y); 41 if(angle1>0&&angle2>0) return true; 42 return false; 43 } 44 45 46 int main(){ 47 int t; 48 cin>>t; 49 while(t--){ 50 double r; 51 point O,p1,p2,p3; 52 cin>>O.x>>O.y>>r; 53 cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y; 54 double d1=dis(p1,O); 55 double d2=dis(p2,O); 56 double d3=dis(p3,O); 57 if(d1<r&&d2<r&&d3<r) cout<<"No"<<endl; 58 else if(d1>r&&d2>r&&d3>r){ 59 if(check(p1,p2,O,r)||check(p1,p3,O,r)||check(p2,p3,O,r)) cout<<"Yes"<<endl; 60 else cout<<"No"<<endl; 61 } 62 else cout<<"Yes"<<endl; 63 } 64 return 0; 65 }

51 Nod 1298 圓與三角形(計算幾何)