public bool IntersectsWith(Circle other)
 {
     var dx = X - other.X;
     var dy = Y - other.Y;
     var r = R + other.R;
     return dx * dx + dy * dy < r * r;
 }
        private Circle createNewCircleAtLowestPossiblePlace(float r)
        {
            const float delta = 2;
            var lo = r;
            var hi = MaxUsedY + r;
            var circle = new Circle(NextDropX - r, 0, r);

            while (lo + delta < hi)
            {
                circle.Y = (lo + hi) / 2;
                if (fits(circle))
                    hi = circle.Y - 1;
                else
                    lo = circle.Y + 1;
            }

            return circle;
        }
 private bool fits(Circle circle)
 {
     return Circles.TrueForAll(_ => !_.IntersectsWith(circle));
 }