java 圆的交点_java求两个圆相交坐标
最近由于項目需要,根據(jù)兩個圓函數(shù)求出相交的坐標(biāo)。實現(xiàn)代碼如下,另感謝兩圓求交點算法實現(xiàn)Java代碼,雖然他所貢獻(xiàn)的代碼中存在問題,但仍有借鑒意義。
1.兩個圓相交的數(shù)學(xué)求法
在中學(xué)數(shù)學(xué)中我們知道,一個圓可以作如下描述,以x1,y1為圓心,r為半徑的一個圓:
那么假設(shè)現(xiàn)在有兩個圓C1與C2,其中C1與C2的描述式如下:
其中C1是以(x1,y1)為圓心,r1為半徑的圓,C2是以(x2,y2)為圓心,r2為半徑的圓。若想求兩個圓的交點,那么這個交點一同時在C1與C2上,即同時滿足C1與C2的方程,此時只需聯(lián)立這兩個方程即可。
我們用C1-C2可得:
整理得:
令
此時
將上式代入C1,整理可得關(guān)于x的一元二次方程:
(這里有個小錯誤)
此后,只要求出該方程的判別式,進行一元二次方程的求解即可。
2.程序清單
根據(jù)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){
//當(dāng)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;
}
}
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java 圆的交点_java求两个圆相交坐标的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: md5碰撞Java_java现在MD5加
- 下一篇: java cookie p3p_P3P解