java求两个圆相交坐标


最近由于项目需要,根据两个圆函数求出相交的坐标。实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义。

1.两个圆相交的数学求法

在中学数学中我们知道,一个圆可以作如下描述,以x1,y1为圆心,r为半径的一个圆:

这里写图片描述


那么假设现在有两个圆C1与C2,其中C1与C2的描述式如下:

这里写图片描述


其中C1是以(x1,y1)为圆心,r1为半径的圆,C2是以(x2,y2)为圆心,r2为半径的圆。若想求两个圆的交点,那么这个交点一同时在C1与C2上,即同时满足C1与C2的方程,此时只需联立这两个方程即可。

这里写图片描述


我们用C1-C2可得:

这里写图片描述


整理得:

这里写图片描述



这里写图片描述


此时

这里写图片描述


将上式代入C1,整理可得关于x的一元二次方程:

这里写图片描述(这里有个小错误)


此后,只要求出该方程的判别式,进行一元二次方程的求解即可。

2.程序清单
根据1中的算法写出程序如下:

package com.ken.blesniff.util; import com.ken.blesniff.bean.Circle; /** * * @author lixiasong * */ public class CirIntersect { /** * 圆A (x-x1)^2 + (y-y1)^2 = r1^2 */ private Circle c1=null; /** * 圆B (x-x2)^2 + (y-y2)^2 = r2^2 */ private Circle c2=null; private double x1; private double y1; private double x2; private double y2; private double r1; private double r2; public CirIntersect(Circle C1,Circle C2){ c1= C1; c2= C2; x1=c1.getX(); y1=c1.getY(); x2=c2.getX(); y2=c2.getY(); r1=c1.getR(); r2=c2.getR(); } /** * 求相交 * @return {x1 , y1 , x2 , y2} */ public double[] intersect(){ // 在一元二次方程中 a*x^2+b*x+c=0 double a,b,c; //x的两个根 x_1 , x_2 //y的两个根 y_1 , y_2 double x_1 = 0,x_2=0,y_1=0,y_2=0; //判别式的值 double delta = -1; //如果 y1!=y2 if(y1!=y2){ //为了方便代入 double A = (x1*x1 - x2*x2 +y1*y1 - y2*y2 + r2*r2 - r1*r1)/(2*(y1-y2)); double B = (x1-x2)/(y1-y2); a = 1 + B * B; b = -2 * (x1 + (A-y1)*B); c = x1*x1 + (A-y1)*(A-y1) - r1*r1; //下面使用判定式 判断是否有解 delta=b*b-4*a*c; if(delta >0) { x_1=(-b+Math.sqrt(b*b-4*a*c))/(2*a); x_2=(-b-Math.sqrt(b*b-4*a*c))/(2*a); y_1 = A - B*x_1; y_2 = A - B*x_2; } else if(delta ==0) { x_1 = x_2 = -b/(2*a); y_1 = y_2 = A - B*x_1; }else { System.err.println("两个圆不相交"); return null; } } else if(x1!=x2){ //当y1=y2时,x的两个解相等 x_1 = x_2 = (x1*x1 - x2*x2 + r2*r2 - r1*r1)/(2*(x1-x2)); a = 1 ; b = -2*y1; c = y1*y1 - r1*r1 + (x_1-x1)*(x_1-x1); delta=b*b-4*a*c; if(delta >0) { y_1 = (-b+Math.sqrt(b*b-4*a*c))/(2*a); y_2 = (-b-Math.sqrt(b*b-4*a*c))/(2*a); } else if(delta ==0) { y_1=y_2=-b/(2*a); }else { System.err.println("两个圆不相交"); return null; } } else { System.out.println("无解"); return null; } return new double[]{x_1,y_1,x_2,y_2}; } } 

 

 

其中Circle类代码如下

package com.ken.blesniff.bean; /** * * @author lixiasong * */ public class Circle{ private double x; private double y; private double r; public Circle(double X,double Y,double R){ x=X; y=Y; r=R; } public double getX(){ return x; } public double getY(){ return y; } public double getR(){ return r; } } 

 

 

工程文件参见java求两圆相交坐标
转载请注明文章出处:http://blog.csdn.net/u013780605/article/details/52673223


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM