您的位置:首页 > 其它

51 nod 1298(计算几何)@

2017-04-15 10:50 211 查看
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"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 <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
double eps=1e-8;
typedef long long LL;
struct node
{
double x, y;
}p
;

double dist(double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

double zhuixian(double x,double y,double x1, double y1,double x2, double y2)
{
double a=y1-y2, b=x2-x1;
double c=-(x1*a+y1*b);
double xq=(b*b*x-a*b*y-a*c)/(a*a+b*b), yq=(a*a*y-a*b*x-b*c)/(a*a+b*b);
double xmax=max(x1,x2), xmin=min(x1,x2), ymax=max(y1,y2), ymin=min(y1,y2);
if(xq<xmin||xq>xmax||yq<ymin||yq>ymax) return -1;
return fabs(a*x+b*y+c)/sqrt(a*a+b*b);
}

int main()
{
int t;
scanf("%d", &t);
while(t--)
{
double x, y, r, x1, y1, x2, y2;
scanf("%lf %lf %lf", &x, &y, &r);
for(int i=0;i<3;i++) scanf("%lf %lf", &p[i].x, &p[i].y);
int flag=0;
for(int i=0;i<3;i++)
{
for(int j=i+1;j<3;j++)
{
x1=p[i].x, y1=p[i].y, x2=p[j].x, y2=p[j].y;
double dis1=dist(x,y,x1,y1), dis2=dist(x,y,x2,y2);
double xmin=min(dis1,dis2), xmax=max(dis1,dis2);
double tmp=zhuixian(x,y,x1,y1,x2,y2);
if(tmp>0) xmin=tmp;
if(xmin<=r&&xmax>=r)
{
flag=1;
break;
}
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}




1)相交:
三角形三个点有在圆内的,也有在圆外的,必相交
三角形有一个顶点在圆上,必相交。
三角形三边都在圆外,圆心到三边距离,存在小于等于半径的,必相交
(2)不相交:
三角形三边都在圆内,必不相交
三角形三边都在圆外,且圆心到三边距离均大于半径,必不相交

点到直线的距离公式的七种推导方法
 
湖南省
 
 
黄爱民
 
 
赵长春
 
已知点
 
0
0
(
,
)
P
x
y
直线
:
0(
0,
0)
l
Ax
By
C
A
B





求点
P
到直线
 
l
的距离。
(因为
特殊直线很容易求距离,这里只讨论一般直线)
 
一、
 
定义法
 
证:根据定义,点
P
到直线
 
l
的距离是点
P
到直线
 
l
的垂线段的长,如图
1

 
设点
P
到直线
l
的垂线为
 
'
l
,垂足为
Q
,由
 
'
l
l

可知
 
'
l
的斜率为

 
B
A
 
'
l


的方程:
0
0
(
)
B
y
y
x
x
A




l
联立方程组
 

解得交点
2
2
0
0
0
0
2
2
2
2
(
,
)
B
x
ABy
AC
A
y
ABx
BC
Q
A
B
A
B






 

 
2
2
2
2
2
0
0
0
0
0
0
2
2
2
2
2
2
2
2
0
0
0
0
2
2
2
2
2
2
2
2
2
0
0
0
0
0
0
2
2
2
2
2
2
2
2
|
|
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
B
x
ABy
AC
A
y
ABx
BC
PQ
x
y
A
B
A
B
A
x
ABy
AC
B
y
ABx
BC
A
B
A
B
A
Ax
By
C
B
Ax
By
C
Ax
By
C
A
B
A
B
A
B

































0
0
2
2
|
|
|
Ax
By
C
PQ
A
B






点到直线的距离公式的七种推导方法
 
湖南省
 
 
黄爱民
 
 
赵长春
 
已知点
 
0
0
(
,
)
P
x
y
直线
:
0(
0,
0)
l
Ax
By
C
A
B





求点
P
到直线
 
l
的距离。
(因为
特殊直线很容易求距离,这里只讨论一般直线)
 
一、
 
定义法
 
证:根据定义,点
P
到直线
 
l
的距离是点
P
到直线
 
l
的垂线段的长,如图
1

 
设点
P
到直线
l
的垂线为
 
'
l
,垂足为
Q
,由
 
'
l
l

可知
 
'
l
的斜率为

 
B
A
 
'
l


的方程:
0
0
(
)
B
y
y
x
x
A




l
联立方程组
 

解得交点
2
2
0
0
0
0
2
2
2
2
(
,
)
B
x
ABy
AC
A
y
ABx
BC
Q
A
B
A
B






 

 
2
2
2
2
2
0
0
0
0
0
0
2
2
2
2
2
2
2
2
0
0
0
0
2
2
2
2
2
2
2
2
2
0
0
0
0
0
0
2
2
2
2
2
2
2
2
|
|
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
B
x
ABy
AC
A
y
ABx
BC
PQ
x
y
A
B
A
B
A
x
ABy
AC
B
y
ABx
BC
A
B
A
B
A
Ax
By
C
B
Ax
By
C
Ax
By
C
A
B
A
B
A
B

































0
0
2
2
|
|
|
Ax
By
C
PQ
A
B




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