public static IEnumerable <Pair <T> > Create(BasePartition <T> partition, ISpatialPartition <T> otherPartition)
            {
                var enumerable = Pool.Obtain();

                enumerable._partition      = partition;
                enumerable._otherPartition = otherPartition;
                enumerable._candidates     = partition.GetOverlaps(otherPartition.Aabb).GetEnumerator();
                return(enumerable);
            }
            public static IEnumerable <T> Create(BasePartition <T> partition, T item)
            {
                var enumerable = Pool.Obtain();

                enumerable._partition = partition;
                enumerable._item      = item;
                Aabb aabb = partition.GetAabbForItem(item);

                enumerable._enumerator = partition.GetOverlaps(aabb).GetEnumerator();
                return(enumerable);
            }
            public static IEnumerable <T> Create(BasePartition <T> partition, ref Ray ray)
            {
                var enumerable = Pool.Obtain();

                enumerable._partition           = partition;
                enumerable._ray                 = ray;
                enumerable._rayDirectionInverse = new Vector3F(1 / ray.Direction.X,
                                                               1 / ray.Direction.Y,
                                                               1 / ray.Direction.Z);
                enumerable._epsilon = Numeric.EpsilonF * (1 + partition.Aabb.Extent.Length);

                Aabb rayAabb = new Aabb(ray.Origin, ray.Origin);

                rayAabb.Grow(ray.Origin + ray.Direction * ray.Length);
                enumerable._enumerator = partition.GetOverlaps(rayAabb).GetEnumerator();
                return(enumerable);
            }