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 }