public static (HitResult hit, double refractiveIndexEntering, double refractiveIndexExiting) prepareComputations(Ray r, Intersection i, Intersection[] ixs)
        {
            var h = i.figure
                    .AllHits(r.origin, r.dir)
                    .First(hit => Core.Constants.EpsilonCompare(hit.Distance, i.t));

            if (ixs == null)
            {
                return(h, 1.0, 1.0);
            }

            var all = ixs.Select(x => x.figure
                                 .AllHits(r.origin, r.dir)
                                 .First(hit => Core.Constants.EpsilonCompare(hit.Distance, x.t)))
                      .ToArray();

            var(refractiveIndexEntering, refractiveIndexExiting) = Refraction.computeRefractiveIndexes(h.Distance, all);

            return(h, refractiveIndexEntering, refractiveIndexExiting);
        }