Problem G: 说好的点呢
Time Limit: 1 Sec Memory Limit: 16 MBSubmit: 2380 Solved: 392
[ Submit][ Status][ Web Board]
Description
两点确定一条直线,判断一条直线与一个圆的位置关系。
Input
输入中前两行每行描述一个点的坐标(x,y),x,y均为实数。
第三行包含三个实数,即圆心坐标和圆的半径R>0。
Output
输出包含三种情况,计算误差应在1e-3(0.001)内。
“Interseetion”(相交时输出);
“Tangency”(相切时输出);
“Disjoint”(相离时输出);
以上输出不含引号。
Sample Input
1 00 10 0 1
Sample Output
Interseetion
HINT
回忆中学的几何知识,最好能自己先想到此题的几何解,实在想不到,可以查查法线方程之类的,然后用程序实现。这里要用到浮点数的精度控制。
Append Code
#include<stdio.h>
#include<math.h>
int
main()
{
double
xi,yi,xii,yii,x,y,k,d,m,n,r;
scanf
(
"%lf %lf"
,&xi,&yi);
scanf
(
"%lf %lf"
,&xii,&yii);
scanf
(
"%lf %lf %lf"
,&x,&y,&r);
if
(r>0)
{
if
(xi==xii&&yi!=yii)
//if(yi!=yii)
d=
fabs
(x)+
fabs
(xi);
else
{
k=(yi-yii)/(xi-xii);
m=
fabs
(k*x+(-1)*y+yi-k*xi);
n=
fabs
(
sqrt
(k*k+1));
d=m/n;
}
if
(d>r+0.001)
printf
(
"Disjoint"
);
if
(d<r-0.001)
printf
(
"Interseetion"
);
if
(
fabs
(d-r)<1e-3)
printf
(
"Tangency"
);
}
关于浮点型数据的精度控制问题,在浮点型数据中,两个数的比较需要进行精度控制,">"形式,m>n+精度;"<"形式,m<n-精度;"="形式,fabs(m-n)<精度。