判断线段与圆是否相交

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 
 5 inline int read(){
 6 int x=0,f=1; char ch=getchar();
 7 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
 8 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}
 9 return x*f;
10 }
11 
12 inline void write(int x){
13 if(x<0){
14 putchar('-');
15 x=-x;
16 }
17 if(x>9){
18 write(x/10);
19 }
20 putchar(x%10+'0');
21 }
22 
23 double X,Y,R;
24 double p_x1,p_y1,p_x2,p_y2;
25 
26 int judge(double a,double b){ //判断点在不在圆内圆上
27 double shu1=R*R,shu2=(a-X)*(a-X)+(b-Y)*(b-Y);
28 if(shu1>shu2) return -1; //圆内
29 else if(shu1==shu2) return 0; //圆上
30 else return 1; //圆外
31 }
32 
33 
34 int main(){
35 while(scanf("%lf%lf%lf",&X,&Y,&R)!=EOF){
36 scanf("%lf%lf%lf%lf",&p_x1,&p_y1,&p_x2,&p_y2);
37 int flag1=judge(p_x1,p_y1),flag2=judge(p_x2,p_y2);
38 bool flag=false;
39 if(flag1==0||flag2==0) flag=true; //有一个在圆上
40 else if(flag1==-1&&flag2==-1) flag=false; //两个都在圆内
41 else if((flag1==1&&flag2==-1)||(flag1==-1&&flag2==1)) flag=true; //一个在圆内 一个在圆外
42 else{
43 double A,B,C;
44 if(p_x1==p_x2) A=1,B=0,C=-p_x1;
45 else if(p_y1==p_y2) A=0,B=1,C=-p_y1;
46 else A=p_y2-p_y1,B=-(p_x2-p_x1),C=-p_x1*p_y2+p_x2*p_y1;
47 double shu1=(A*X+B*Y+C)*(A*X+B*Y+C);
48 double shu2=A*A+B*B;
49 if(shu1<=R*R*shu2){
50 double eex=X-p_x1,eey=Y-p_y1,rrx=p_x2-p_x1,rry=p_y2-p_y1;
51 double angleone=eex*rrx+eey*rry;
52 eex=X-p_x2,eey=Y-p_y2,rrx=p_x1-p_x2,rry=p_y1-p_y2;
53 double angletwo=eex*rrx+eey*rry;
54 if(angleone>0&&angletwo>0) flag=true;
55 }
56 
57 }
58 if(!flag) printf("The line segment does not intersect the circle.\n");
59 else printf("The line segment intersects the circle.\n");
60 }
61 
62 return 0;
63 }
64 
65  
View Code

 

posted @ 2019-11-19 19:36  厂长在线养猪  Views(357)  Comments(0Edit  收藏  举报