public Vector3D Sample() { Vector3D output; IntervalSampler sampler = m_sampler; output.X = sampler.Sample(out sampler); if (sampler != null) { output.Y = sampler.Sample(out sampler); } else { output.Y = MyUtils.GetRandomDouble(m_bBox.Min.Y, m_bBox.Max.Y); } if (sampler != null) { output.Z = sampler.Sample(out sampler); } else { output.Z = MyUtils.GetRandomDouble(m_bBox.Min.Z, m_bBox.Max.Z); } System.Diagnostics.Debug.Assert(sampler == null, "Inconsistency in MyBBSetSampler"); return(output); }
public double Sample(out IntervalSampler childSampler) { // TODO: Implement divide & conquer for speedup double sample = MyUtils.GetRandomDouble(0.0, TotalWeight); double lastLimit = m_min; double lastWeight = 0.0; for (int i = 0; i < m_entries.Count; ++i) { if (m_entries[i].CumulativeWeight >= sample) { childSampler = m_entries[i].Sampler; double weightRange = m_entries[i].CumulativeWeight - lastWeight; double t = (sample - lastWeight) / weightRange; return(t * m_entries[i].UpperLimit + (1.0 - t) * lastLimit); } lastLimit = m_entries[i].UpperLimit; lastWeight = m_entries[i].CumulativeWeight; } System.Diagnostics.Debug.Assert(false, "Shouldn't get here!"); childSampler = null; return(m_max); }