zoukankan      html  css  js  c++  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;
        }
    }
    

    工程文件参见java求两圆相交坐标
    转载请注明文章出处:http://blog.csdn.net/u013780605/article/details/52673223

  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/antflow/p/7568165.html
Copyright © 2011-2022 走看看