public static IEnumerable <CurveIterator <T> > Iterate <T>(this curve <T> c, float stepMultiplier) { float sl = c.length; float islsl = 1 / (sl * sl); float t = 0; while (true) { CurveIterator <T> i; i.t = t; i.value = c.value(t); i.velocity = c.velocity(t); yield return(i); if (t == 1) { yield break; } float dt = MathExOps.Clamp(MathTypeTag <T> .Get().scalar(i.velocity) * islsl * stepMultiplier, islsl, 1); t = MathExOps.Clamp01(t + dt); } }
public static IEnumerable <CurveIterator <T> > IterateEquidistant <T>(this curve <T> c, float fraction) { var d = c.distance; float length = d.length; float delta = d.length * fraction; float cd = 0; while (true) { CurveIterator <T> i; i.t = d.time(cd); i.value = c.value(i.t); i.velocity = c.velocity(i.t); yield return(i); if (cd == length) { yield break; } cd = MathExOps.Clamp(cd + delta, 0, length); } }
[Serializable] public class controller_type : curve_controller <curve <T>, T> { public controller_type(curve <T> c) : base(c) { }
[Serializable] public class distance_type : curve_distance <curve <T>, T> { public distance_type(curve <T> c) : base(c) { }
public static IEnumerable <CurveIterator <T> > Iterate <T>(this curve <T> c) { return(c.Iterate(1f)); }