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); }
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 }); }
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 }); }
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); }
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 }); }
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); }
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 }); }