public static void TestAutoRotationEquivalence() { var p1 = new AutoWindingPath(TestPath1, Vector3.up); var p2 = new AutoWindingPath(TestNormalizedPath1, Vector3.up); for (int i = 0; i <= 200; ++i) { double t = i / 200.0; double adjustedT = p2.GetUnmappedTime(t); Vector3 norm1 = p1.GetNormal(t); Vector3 norm2 = p2.GetNormal(adjustedT); AreEqual(norm1, norm2, 0.01f); } }
private IPath CalculatePath() { if (_knots.Count == 0) { return(null); } RecalculateControlPoints(); List <IPath> paths = new List <IPath>(); Vector3 startUp = StartUp; Vector3 up = startUp; for (int i = 0; i < NumberOfSegments; ++i) { IPath path = GetSegmentPath(i); if (RotationMode == RotationMode.AutoWind) { AutoWindingPath rotationPath = null; if (i == NumberOfSegments - 1) { rotationPath = new AutoWindingPath(path, up, startUp); } else { rotationPath = new AutoWindingPath(path, up); if (i == 0) { startUp = rotationPath.StartUpVector; } } path = rotationPath; up = rotationPath.EndUpVector; } else if (RotationMode == RotationMode.PerKnotUp) { int index = i % _knots.Count; int nextIndex = (i + 1) % _knots.Count; path = new AutoWindingPath(path, _knots[index].Up, _knots[nextIndex].Up); } paths.Add(path); } return(new ChainedPath(OvershootMode, paths)); }