コード例 #1
0
ファイル: svg.cs プロジェクト: chuongmep/Dynamo-Addons
        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);
                }
            }
        }