题目描述
给出一个圆的圆心坐标与圆的半径,和一条直线上的两点坐标,求这条直线与圆有多少个交点。

输入
输入3个实数x,y,r值分别表示圆心坐标与圆的半径,输入4个实数x1,y1,x2,y2表示直线上的两点。多实例,输入到文件尾结束。

输出
输出直线与圆的交点个数。

样例输入
复制
1 1 1 0 0 1 1
样例输出
复制
2

代码:需要特殊考虑斜率不存在 的情况,其他情况一样,按照之前学的圆与直线的交点来写,与半径r比较的时候需要考虑精度。

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include <iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int main()
 7 {
 8     double x,y,r,x1,y1,x2,y2;
 9     double k,b,d;
10     while(scanf("%lf %lf %lf %lf %lf %lf %lf",&x,&y,&r,&x1,&y1,&x2,&y2)!=EOF)
11     {
12         if(fabs(x2-x1)<1e-10)//斜率不存在
13             d=fabs(x-x1);
14         else
15         {
16             k=(y2-y1)/(x2-x1);
17             b=y1-k*x1;
18             d=fabs(k*x-y+b)/sqrt(k*k+1);
19         }
20         if(fabs(d-r)<1e-10)
21             printf("1\n");
22         else if(d<r)
23             printf("2\n");
24         else
25             printf("0\n");
26     }
27     return 0;
28 }