• 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

  • 相关阅读:
    栈和队列
    链表
    map
    二叉平衡树旋转
    二叉排序树详情
    红黑树详情
    查并集
    动态规划
    位操作
    字典树
  • 原文地址:https://www.cnblogs.com/antflow/p/7568165.html
Copyright © 2020-2023  润新知