51Nod 1298 圆与三角形
复制代码
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 using namespace std; 5 6 const double eps = 1e-8; 7 int cmp(double x) 8 { 9 if (fabs(x) < eps) return 0; 10 if (x > 0) return 1; 11 return -1; 12 } 13 14 struct point 15 { 16 double x, y; 17 18 point() {} 19 point(double a, double b) :x(a), y(b) {} 20 21 void input() { 22 scanf("%lf%lf", &x, &y); 23 } 24 //重载操作符 25 friend point operator - (const point &a, const point &b) { 26 return point(a.x - b.x, a.y - b.y); 27 } 28 29 double norm() { 30 return sqrt(x*x + y*y); 31 } 32 }; 33 34 struct cicle 35 { 36 point p; //圆心 37 double r; 38 39 void input() { 40 scanf("%lf%lf%lf", &p.x, &p.y, &r); 41 } 42 }; 43 44 double dot(const point &a, const point &b) 45 { 46 return a.x*b.x + a.y*b.y; 47 } 48 49 double det(const point &a, const point &b) 50 { 51 return a.x*b.y - a.y*b.x; 52 } 53 54 double dist(const point &a, const point &b) 55 { 56 return (a - b).norm(); 57 } 58 59 double dis_point_segment(const point p, const point s, const point t) 60 { 61 if (cmp(dot(p - s, t - s))<0) return (p - s).norm(); 62 if (cmp(dot(p - t, s - t))<0) return (p - t).norm(); 63 return fabs(det(s - p, t - p) / dist(s, t)); 64 } 65 66 bool cross(cicle o, point a, point b, point c) 67 { 68 double d1, d2, d3; 69 d1 = dist(o.p, a); 70 d2 = dist(o.p, b); 71 d3 = dist(o.p, c); 72 //各点到圆心的距离 73 if (d1<o.r && d2<o.r && d3<o.r) 74 //都在圆内 75 return false; 76 if (dis_point_segment(o.p, a, b)>o.r 77 && dis_point_segment(o.p, a, c)>o.r 78 && dis_point_segment(o.p, b, c)>o.r) 79 return false; 80 return true; 81 } 82 83 int main() 84 { 85 int T; 86 scanf("%d", &T); 87 while (T--) { 88 cicle o; 89 o.input(); 90 point a, b, c; 91 a.input(); 92 b.input(); 93 c.input(); 94 if (cross(o, a, b, c)) 95 printf("Yes\n"); 96 else 97 printf("No\n"); 98 } 99 return 0; 100 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步