public static List<Curve> MorphTo(this Curve curve1, Curve curve2, int numberOfLines, int precision = 10, double offset = 0) { numberOfLines++; Surface virtualSurface = Surface.ByLoft(new List<Curve>() { curve1, curve2 }); Vector direction = virtualSurface.NormalAtParameter(0.5, 0.5); List<Curve> curves = new List<Curve>(); // Divide both curves using the precision factor Point[] pointsCurve1 = curve1.PointDivide(precision); Point[] pointsCurve2 = curve2.PointDivide(precision); // Create a Matrix for the morphed points Point[][] points = new Point[precision + 1][]; // If the Curves are in different directions, flip them. if (pointsCurve1[0].DistanceTo(pointsCurve2[pointsCurve2.Length - 1]) < pointsCurve1[0].DistanceTo(pointsCurve2[0])) { Array.Reverse(pointsCurve2); } // Draw construction lines between the two curves using the division points for (int i = 0; i < pointsCurve1.Length; i++) { Line line = Line.ByStartPointEndPoint(pointsCurve1[i], pointsCurve2[i]); // Divide the construction line into the number of curves to create // Add the divsion points to the matrix points[i] = line.PointDivide(numberOfLines); } // Create an empty Array holding the pointWeights double[] pointWeights = new double[numberOfLines]; // Flip the Matrix to create new curves from Point[][] transposedPoints = points.TransposeRowsAndColumns(); // Create Curves from the Matrix for (int i = 1; i < transposedPoints.Length - 1; i++) { NurbsCurve curve = NurbsCurve.ByControlPoints(transposedPoints[i].ToList()); Curve curveToSegment = (offset != 0) ? (Curve)curve.Translate(direction, offset) : curve; curves.Add(curveToSegment); } return curves; }