java求兩個圓相交座標
阿新 • • 發佈:2019-02-14
最近由於專案需要,根據兩個圓函式求出相交的座標。實現程式碼如下,另感謝兩圓求交點演算法實現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;
}
}