1. 程式人生 > >java求兩個圓相交座標

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;
    }
}