public IntersectionCount intersectsWithCircle(Circle circle) {
		// (x - xO1)^2 + (y - yO1)^2 = r1^2
		double r1 = this.radius;
		double xO1 = this.center.x;
		double yO1 = this.center.y;
		
		// (x - xO2)^2 + (y - yO2)^2 = r2^2
		double r2 = circle.radius;
		double xO2 = circle.center.x;
		double yO2 = circle.center.y;
		
		double d;
		
		if (Apollonius.eq(xO1, xO2) && Apollonius.eq(yO1, yO2)) {
			// equal center points
			if (Apollonius.eq(r1, r2))
				return IntersectionCount.INFINITY;
			else
				return IntersectionCount.ZERO;
		}
		else if (Apollonius.eq(yO1, yO2) && Apollonius.notEq(xO1, xO2)) {
			// Both circle's center points have same y
			double x1 = (Math.pow(r1, 2) - Math.pow(r2, 2)) / (2*xO2 - 2*xO1) + (xO1 + xO2) / 2;
			d = Math.pow(r1, 2) - Math.pow(x1, 2) + 2*x1*xO1 - Math.pow(xO1, 2);
		}
		else if (Apollonius.eq(xO2, xO1) && Apollonius.notEq(yO2, yO1)) {
			// Both circle's center points on same x
			double y1 = (Math.pow(r1, 2) - Math.pow(r2, 2)) / (2*yO2 - 2*yO1) + (yO1 + yO2) / 2;
			d = Math.pow(r1, 2) - Math.pow(y1, 2) + 2*y1*yO1 - Math.pow(yO1, 2);
		}
		else {
			// All other cases
			// (x - xO1)^2 + (y - yO1)^2 - r^2 = 0;
			// y = l - x*m
			double m = (xO2 - xO1) / (yO2 - yO1);
			double l = (Math.pow(r1, 2) - Math.pow(r2, 2) + Math.pow(xO2, 2) - Math.pow(xO1, 2) + Math.pow(yO2, 2) - Math.pow(yO1, 2)) / (2*(yO2 - yO1));
			
			// x^2 + (~~~/a)x + ~~~/a = 0
			// x^2 + pa + q = 0
			double a = 1 + Math.pow(m, 2);
			double p = (-2*xO1 - 2*l*m + 2*yO1*m) / a;
			double q = (Math.pow(xO1, 2) + Math.pow(l, 2) - 2*yO1*l + Math.pow(yO1, 2) - Math.pow(r1, 2)) / a;
			
			// x1/2 = -p/2 ± √(d)
			d = Math.pow(p, 2) / 4 - q;
		}
		
		if (Apollonius.round(d) > 0) {
			return IntersectionCount.TWO;
		}
		else if (Apollonius.round(d) == 0) {
			return IntersectionCount.ONE;
		}
		else {
			return IntersectionCount.ZERO;
		}
	}