java求两个圆相交坐标

来源:互联网 发布:电脑翻墙好用的软件 编辑:程序博客网 时间:2024/05/16 06:05

最近由于项目需要,根据两个圆函数求出相交的坐标。实现代码如下,另感谢两圆求交点算法实现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

0 0
原创粉丝点击