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

原文地址:https://www.cnblogs.com/antflow/p/7568165.html