private static void DecomposeCurve(int n, int p, double[] U, Point[] P, out int nb, out Point[][] Q) { int m = n + p + 1; int a = p; int b = p + 1; nb = 0; // If there are m+1 knots and a clamped knot vector // The number of knot intervals would ideally be (m-2p) // which is also the max number of Bezier curves that can be created point[,] qq = new point[m - 2 * p, p + 1]; for (int i = 0; i <= p; i++) { qq[nb, i].X = P[i].X; qq[nb, i].Y = P[i].Y; qq[nb, i].Z = P[i].Z; } while (b < m) { int i = b; while (b < m && U[b + 1] == U[b]) { b++; } int mult = b - i + 1; if (mult < p) { double[] alphas = new double[p]; var numer = U[b] - U[a]; for (int j = p; j > mult; j--) { alphas[j - mult - 1] = numer / (U[a + j] - U[a]); } int r = p - mult; for (int j = 1; j <= r; j++) { var save = r - j; int s = mult + j; for (int k = p; k >= s; k--) { var alpha = alphas[k - s]; qq[nb, k].X = alpha * qq[nb, k].X + (1 - alpha) * qq[nb, k - 1].X; qq[nb, k].Y = alpha * qq[nb, k].Y + (1 - alpha) * qq[nb, k - 1].Y; qq[nb, k].Z = alpha * qq[nb, k].Z + (1 - alpha) * qq[nb, k - 1].Z; } if (b < m) { qq[nb + 1, save] = qq[nb, p]; } } } nb = nb + 1; if (b < m) { for (int j = p - mult; j <= p; j++) { qq[nb, j].X = P[b - p + j].X; qq[nb, j].Y = P[b - p + j].Y; qq[nb, j].Z = P[b - p + j].Z; } a = b; b = b + 1; } } int nrows = qq.GetLength(0); Q = new Point[nrows][]; for (int i = 0; i < nrows; i++) { Q[i] = new Point[p + 1]; for (int j = 0; j <= p; j++) { Q[i][j] = Point.ByCoordinates( qq[i, j].X, qq[i, j].Y, qq[i, j].Z); } } }