1. 程式人生 > >1298 圓與三角形

1298 圓與三角形

1298 圓與三角形

  給出圓的圓心和半徑,以及三角形的三個頂點,問圓同三角形是否相交。相交輸出"Yes",否則輸出"No"。(三角形的面積大於0)。  

輸入

第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)

輸出

共T行,對於每組輸入資料,相交輸出"Yes",否則輸出"No"。

輸入樣例

2
0 0 10
10 0
15 0
15 5
0 0 10
0 0
5 0
5 5

輸出樣例

Yes
No

只要找到方法,這題就很好做.
主要是要有幾何模板

 1 #include <bits/stdc++.h>
 2 #define inf 0x3f3f3f3f
 3 using namespace std;
 4 
 5 double ptosdist(double x, double y, double xx, double
yy, double x2, double y2){//點到線段最短距離模板 向量法 6 double cnt = (x2 - xx)*(x - xx) + (y2 - yy)*(y - yy); 7 if(cnt <= 0) 8 return sqrt((x - xx)*(x - xx) + (y - yy)*(y - yy)); 9 10 double ans = (x2 - xx)*(x2 - xx) + (y2 - yy)*(y2 - yy); 11 if(cnt >= ans){ 12 return
sqrt((x - x2)*(x - x2) + (y - y2)*(y - y2)); 13 } 14 double r = cnt/ans; 15 double px = xx + (x2 - xx)*r; 16 double py = yy + (y2 - yy)*r; 17 return sqrt((x - px)*(x - px) + (py - y)*(py - y)); 18 } 19 20 double ptopdist(double x, double y, double xx, double yy){ //點到點距離 21 return sqrt((xx - x)*(xx - x) + (yy - y)*(yy - y)); 22 } 23 int t; 24 double xn[4], yk[4]; 25 26 int main(){ 27 cin>>t; 28 while(t--){ 29 double an = (double)inf; 30 double bn = 0; 31 double x,y,R; 32 cin>>x>>y>>R; 33 for(int i = 0; i < 3; i++){ 34 cin>>xn[i]>>yk[i]; 35 bn = max(bn, ptopdist(x, y, xn[i], yk[i])); 36 } 37 for(int i = 0; i < 3; i++){ 38 double pos = ptosdist(x, y, xn[i], yk[i], xn[(i+1)%3], yk[(i+1)%3]); 39 an = min(an, pos); 40 } 41 if(an <= R && bn >= R){ 42 cout<<"Yes"<<endl; 43 }else{ 44 cout<<"No"<<endl; 45 } 46 } 47 return 0; 48 }