static public Point[] find2CirclesIntersections(final Point c1, final double r1, 
                                                    final Point c2, final double r2) {
        
        if (r1 < 0 || r2 < 0)
            return null;
        
        Point[] result = null;
        
        if (r1 == 0 || r2 == 0){
            result = new Point[2];
            if (r1 == 0)
                result[0] = new Point(c1.getX(), c1.getY());
            else
                result[0] = new Point(c2.getX(), c2.getY());
             result[1] = result[0];
             return result;
        }
        
        double d = distance(c1, c2);
        double cosAlpha = 0.5 * (d*d - r2*r2 + r1*r1) / d / r1;
        double theta = Math.atan2(c2.getY() - c1.getY(), c2.getX() - c1.getX());

        if (cosAlpha < 1) {
            double alpha = Math.acos(cosAlpha);
            result = new Point[2];
            result[0] = new Point(c1.getX() + r1 * Math.cos(theta + alpha), c1.getY() + r1 * Math.sin(theta + alpha));
            result[1] = new Point(c1.getX() + r1 * Math.cos(theta - alpha), c1.getY() + r1 * Math.sin(theta - alpha));
        } else if ((r1 + r2) / d > 0.85) {
            result = new Point[2];
            result[0] = new Point(c1.getX() + (c2.getX() - c1.getX()) * r1 / d, c1.getY() + (c2.getY() - c1.getY()) * r1 / d);
            result[1] = result[0];
        }
        
        return result;
    }