51Nod 1298 圆与三角形
2017-09-09 11:11
288 查看
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出”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示例
Output示例
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
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; const double eps = 1e-6; bool fun(double a, double b, double c, double l, double r) { double d = b*b - 4 * a*c; if (d >eps) { double x1 = (-b) / (2 * a) - sqrt(d) / (2 * a); double x2 = (-b) / (2 * a) + sqrt(d) / (2 * a); if (x1 - min(l, r) > -eps && x1 - max(l, r) < eps) return true; if (x2 - min(l, r) > -eps && x2 - max(l, r) < eps) return true; return false; } return false; } bool f(double x ,double y1,double y2,double xc,double yc,double r) { if (x - (xc - r) > -eps&&x - (xc + r) < eps) { double a = sqrt(r*r - (x - xc)*(x - xc)); double h = yc + a; double l = yc - a; if (l - min(y1, y2) > -eps&&l - max(y1, y2) < eps) return true; if (h - min(y1, y2) > -eps&&h - max(y1, y2) < eps) return true; return false; } return false; } int main() { int t; scanf("%d", &t); while (t--) { double xc, yc, r, x1, x2, x3, y1, y2, y3; scanf("%lf%lf%lf", &xc, &yc, &r); scanf("%lf%lf", &x1, &y1); scanf("%lf%lf", &x2, &y2); scanf("%lf%lf", &x3, &y3); bool flag = false; double k, c; if (fabs(x1 - x2)<eps) { flag = f(x1,y1,y2,xc,yc,r); } else{ k = (y2 - y1) / (x2 - x1); c = y1 - k*x1; flag = fun(k*k + 1, 2 * (c - yc)*k - 2 * xc, xc*xc + (c - yc)*(c - yc) - r*r, x1, x2); } if (!flag) { if (fabs(x1 - x3)<eps) { flag = f(x1,y1,y3,xc,yc,r); } else { k = (y3 - y1) / (x3 - x1); c = y1 - k*x1; flag = fun(k*k + 1, 2 * (c - yc)*k - 2 * xc, xc*xc + (c - yc)*(c - yc) - r*r, x1, x3); } } if (!flag) { if (fabs(x2 - x3)<eps) { flag = f(x3,y2,y3,xc,yc,r); } else { k = (y2 - y3) / (x2 - x3); c = y2 - k*x2; flag = fun(k*k + 1, 2 * (c - yc)*k - 2 * xc, xc*xc + (c - yc)*(c - yc) - r*r, x2, x3); } } if (flag) puts("Yes"); else puts("No"); } return 0; }
相关文章推荐
- 51nod 1298 圆与三角形
- 51nod 1298 圆与三角形
- 51nod 1298:圆与三角形(计算几何)
- 51nod 1298 圆与三角形(计算几何)
- 51Nod 1298 圆与三角形 计算几何
- [51nod]1298 圆与三角形
- 51nod 1298 圆与三角形
- [51nod]1298 圆与三角形
- 51Nod 1298 圆与三角形
- 【51Nod】1298 - 圆与三角形(计算几何)
- 51nod 1298 圆与三角形(基础题,计算几何)
- 51nod 1298 圆与三角形
- 51Nod-1298 圆与三角形
- 51Nod 1298 圆与三角形
- 51nod 1298 圆与三角形
- 51NOD 1298 圆与三角形
- 51Nod 1298 圆与三角形 (计算几何)
- 51nod 1298 圆与三角形 (计算几何)
- 51Nod 1298 圆与三角形
- 圆与三角形-51NOD 1298