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 }




猜你喜欢

转载自www.cnblogs.com/zllwxm123/p/9905533.html
今日推荐