public Tuple <BoundingBox, BoundingBox> Split() { (var dx, var dy, var dz) = Size(); var greatest = Shape.Max(dx, dy, dz); (var x0, var y0, var z0, _) = Minimum.ToTuple(); (var x1, var y1, var z1, _) = Maximum.ToTuple(); if (greatest == dx) { x0 = x1 = x0 + dx / 2.0; } else if (greatest == dy) { y0 = y1 = y0 + dy / 2.0; } else { z0 = z1 = z0 + dz / 2.0; } var midMin = pt.Point(x0, y0, z0); var midMax = pt.Point(x1, y1, z1); var left = new BoundingBox(Minimum, midMax); var right = new BoundingBox(midMin, Maximum); return(new Tuple <BoundingBox, BoundingBox>(left, right)); }