NOJ [1353] Circles And Lines 求圆与线的关系

本文介绍了一种用于判断圆与直线关系(相交、相离、相切)的算法,详细阐述了点到直线距离的计算公式及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • [1353] Circles And Lines

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • Ok.A circle , x y is the centre,z is radius.
    A line , have pass the x1,y1,x2,y2.
    Ok,see example.
  • 输入
  • This have some cases.
    Each cases,have 7 numbers ,x,y,z,x1,y1,x2,y2.
  • 输出
  • See detail in the Sample Output please.
  • 样例输入
  • 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;
    }
    
    
    


     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值