Ejemplo n.º 1
0
        private double GetRationalBasisDenominator(double u, double v)
        {
            // u
            int n = GetUCount() - 1;
            // v
            int m = GetVCount() - 1;

            double denominator = 0;

            for (int i = 0; i <= n; i++)
            {
                for (int j = 0; j <= m; j++)
                {
                    BasisInfo info1 = new BSplineBasisInfo(i, uDegree, uKnotVector);
                    BasisInfo info2 = new BSplineBasisInfo(j, vDegree, vKnotVector);

                    Func <double, double> basis1 = GetBasisFunction(info1);
                    Func <double, double> basis2 = GetBasisFunction(info2);
                    Point3d pt     = this.pointsGrid[i][j];
                    double  weight = this.weights[i][j];

                    denominator += basis1(u) * basis2(v) * weight;
                }
            }

            return(denominator);
        }
Ejemplo n.º 2
0
        public double[] ParameterAt(double t)
        {
            int     n      = points.Length - 1;
            Point3d result = new Point3d(0, 0, 0);

            if (t == this.knotVector.GetMaxKnot())
            {
                result = points.Last();
            }
            else
            {
                for (int i = 0; i <= n; i++)
                {
                    Point3d pt     = points[i];
                    double  weight = this.weights[i];

                    BasisInfo info  = new BSplineBasisInfo(i, degree, knotVector);
                    var       basis = GetBasisFunction(info);
                    double    val   = basis(t);

                    result += val * pt * weight;
                }
                double denominator = GetRationalBasisDenominator(t);

                if (denominator == 0)
                {
                    throw new DivideByZeroException();
                }

                result /= denominator;
            }

            return(new double[] { result.X, result.Y, result.Z });
        }
Ejemplo n.º 3
0
        public virtual double[] ParameterAt(double t)
        {
            int     n      = points.Length - 1;
            Point3d result = new Point3d(0, 0, 0);

            // Boundary condition
            if (t == this.knotVector.GetMaxKnot())
            {
                result = points.Last();
            }
            else
            {
                for (int i = 0; i <= n; i++)
                {
                    Point3d pt = points[i];

                    BasisInfo             info  = new BSplineBasisInfo(i, degree, knotVector);
                    Func <double, double> basis = this.GetBasisFunction(info);
                    double val = basis(t);


                    result += val * pt;
                }
            }

            return(new double[] { result.X, result.Y, result.Z });
        }
Ejemplo n.º 4
0
        protected override Func <double, double> GetBasisFunction(BasisInfo _info)
        {
            BSplineBasisInfo info = (BSplineBasisInfo)_info;

            int     i     = info.I;
            int     j     = info.J;
            KnotSet knots = info.Knots;

            Func <double, double> basis = GetBasis(i, j, knots);

            return(basis);
        }
Ejemplo n.º 5
0
        public double[] ParameterAt(double u, double v)
        {
            // u
            int n = GetUCount() - 1;
            // v
            int m = GetVCount() - 1;

            Point3d accumulation = new Point3d(0, 0, 0);

            for (int i = 0; i <= n; i++)
            {
                BasisInfo             info1  = new BSplineBasisInfo(i, uDegree, uKnotVector);
                Func <double, double> basis1 = GetBasisFunction(info1);

                // Boundary condition
                if (u == 1 && i == n)
                {
                    basis1 = (t) => 1;
                }

                for (int j = 0; j <= m; j++)
                {
                    BasisInfo             info2  = new BSplineBasisInfo(j, vDegree, vKnotVector);
                    Func <double, double> basis2 = GetBasisFunction(info2);

                    // Boundary condition
                    if (v == 1 && j == m)
                    {
                        basis2 = (t) => 1;
                    }

                    Point3d pt     = this.pointsGrid[i][j];
                    double  weight = this.weights[i][j];

                    accumulation += pt * basis1(u) * basis2(v) * weight;
                }
            }
            double denominator = GetRationalBasisDenominator(u, v);

            if (denominator == 0)
            {
                denominator = 1;
                //throw new DivideByZeroException();
            }

            accumulation /= denominator;

            return(new double[] { accumulation.X, accumulation.Y, accumulation.Z });
        }
Ejemplo n.º 6
0
        private double GetRationalBasisDenominator(double t)
        {
            int n = weights.Length - 1;

            double denominator = 0;

            for (int i = 0; i <= n; i++)
            {
                BasisInfo info = new BSplineBasisInfo(i, degree, knotVector);

                Func <double, double> basis = GetBasisFunction(info);
                double weight = this.weights[i];

                denominator += basis(t) * weight;
            }

            return(denominator);
        }
Ejemplo n.º 7
0
        public double[] ParameterAt(double u, double v)
        {
            // u
            int n = GetUCount() - 1;
            // v
            int m = GetVCount() - 1;

            Point3d accumulation = new Point3d(0, 0, 0);

            for (int i = 0; i <= n; i++)
            {
                BasisInfo             info1  = new BSplineBasisInfo(i, uDegree, uKnotVector);
                Func <double, double> basis1 = GetBasisFunction(info1);

                // Boundary condition
                if (u == 1 && i == n)
                {
                    basis1 = (t) => 1;
                }

                for (int j = 0; j <= m; j++)
                {
                    BasisInfo             info2  = new BSplineBasisInfo(j, vDegree, vKnotVector);
                    Func <double, double> basis2 = GetBasisFunction(info2);

                    // Boundary condition
                    if (v == 1 && j == m)
                    {
                        basis2 = (t) => 1;
                    }

                    Point3d pt = this.pointsGrid[i][j];
                    accumulation += pt * basis1(u) * basis2(v);
                }
            }

            return(new double[] { accumulation.X, accumulation.Y, accumulation.Z });
        }