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++) { for (int j = 0; j <= m; j++) { BasisInfo info1 = new BezierBasisInfo(n, i); BasisInfo info2 = new BezierBasisInfo(m, j); Func <double, double> basis1 = GetBasisFunction(info1); Func <double, double> basis2 = GetBasisFunction(info2); Point3d pt = this.pointsGrid[i][j]; accumulation += pt * basis1(u) * basis2(v); } } return(new double[] { accumulation.X, accumulation.Y, accumulation.Z }); }
protected override Func <double, double> GetBasisFunction(BasisInfo _info) { BezierBasisInfo info = (BezierBasisInfo)_info; int n = info.N; int i = info.I; Func <double, double> func = (t) => MathTool.GetBinomialCoefficient(n, i) * Math.Pow(t, i) * Math.Pow(1 - t, n - i); return(func); }
public double[] ParameterAt(double t) { int n = points.Length - 1; Point3d result = new Point3d(0, 0, 0); for (int i = 0; i <= n; i++) { Point3d pt = points[i]; BasisInfo info = new BezierBasisInfo(n, i); Func <double, double> basis = this.GetBasisFunction(info); double val = basis(t); result += val * pt; } return(new double[] { result.X, result.Y, result.Z }); }