0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 2 0 0 2 0 0 1 2 0 0 3
CASE 1: Tangent. Case 2: Intersect.. CASE 3: Away... Case 4: Away....
无
Mr.wang *
题意 : 输入圆的坐标及半径 输入直线经过的2个点 问直线和圆的关系 是相交 相离 还是相切
注意 点到直线的距离公式 : fabs(ax+by+c)/sqrt(a*a+b*b) 其中上面的是带绝对值的 就因为这里错了n次
#include<stdio.h> #include<string.h> #include<math.h> #define dou 0.0000001 int main() { double d,x,y,z,x1,y1,x2,y2,k,i; int cnt=0,flag; while(scanf("%lf %lf %lf %lf %lf %lf %lf",&x,&y,&z,&x1,&y1,&x2,&y2)!=EOF) { flag=0; cnt++; if(y1==y2) { //if(y1==y-z||y1==y+z) flag=2; if(fabs(y1-y+z)<1e-6||fabs(y1-y-z)<1e-6) flag=2; else // if(y1>y-z &&y1<y+z) flag=3; if(y1-y+z>1e-6&&y1-y-z<-1e-6) flag=3; else flag=1; } else if(x1==x2) { if(fabs(x1-x+z)<1e-6||fabs(x1-x-z)<1e-6) flag=2; else // if(y1>y-z &&y1<y+z) flag=3; // 注意不要用这种方式比较浮点型的大小 尽量如下表示 if(x1-x+z>1e-6&&x1-x-z<-1e-6) flag=3; else flag=1; } else { k=(x1-x2)/(y1-y2); d=fabs((k*y-x-k*y1+x1))/sqrt(k*k+1); if(fabs(d-z)<1e-6) flag=2; else if(d-z<-1e-6) flag=3; else flag=1; } if(cnt%2==0) printf("Case %d: ",cnt); else printf("CASE %d: ",cnt); if(flag==1) printf("Away",cnt); else if(flag==2) printf("Tangent",cnt); else if(flag==3) printf("Intersect",cnt); for(i=1;i<=cnt;i++) printf("."); printf("\n"); } return 0; }