您的位置:首页 > 其它

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示例

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: