private static Vector2 Interpolate(InterpolationMode mode, Vector2 a, Vector2 b, Vector2 c, Vector2 d, float percentaje) { switch (mode) { case InterpolationMode.Hermite: return(Utils.HermiteInterpolate(a, b, c, d, percentaje)); case InterpolationMode.Cubic: return(Utils.CubicInterpolate(a, b, c, d, percentaje)); default: throw new ArgumentOutOfRangeException(nameof(mode), mode, null); } }
private static float InterpolateLength(InterpolationMode mode, IEnumerable <Edge> edges, int resolution, out float[] partialLengths) { partialLengths = edges .Select(e => Enumerable .Range(0, resolution + 1) .Select(cur => Interpolate(mode, e.Prev ?? e.Begin, e.Begin, e.End, e.Next ?? e.End, 1.0f / resolution * cur)) .Pairwise((v1, v2) => (v2 - v1).Length) .Sum()) .ToArray(); return(partialLengths.Sum()); }
private static Vector2 Interpolate(InterpolationMode mode, Edge[] edges, float[] edgesLengths, float length) { var i = 0; var percentaje = 1.0f; for (; i < edgesLengths.Length; i++) { if (length <= edgesLengths[i]) { percentaje = length / edgesLengths[i]; break; } length -= edgesLengths[i]; } if (i == edgesLengths.Length) { i--; } return(Interpolate(mode, edges[i].Prev ?? edges[i].Begin, edges[i].Begin, edges[i].End, edges[i].Next ?? edges[i].End, percentaje)); }