public Point3D Evaluate(double u, double v) { var subpoints = new List <Point3D>(); for (var i = 0; i < 4; ++i) { var subpoint = BernsteinPolynomial.Evaluate3DPolynomial( ArrayHelpers.GetRow(ControlPoints, i), u ); subpoints.Add(subpoint); } return(BernsteinPolynomial.Evaluate3DPolynomial(subpoints, v)); }
public Vector3D Derivative( double u, double v, DerivativeParameter parameter ) { double firstParameter, secondParameter; Func <int, Point3D[]> generator; switch (parameter) { case DerivativeParameter.U: generator = (i) => ArrayHelpers.GetColumn(ControlPoints, i); firstParameter = v; secondParameter = u; break; case DerivativeParameter.V: generator = (i) => ArrayHelpers.GetRow(ControlPoints, i); firstParameter = u; secondParameter = v; break; default: throw new ArgumentOutOfRangeException( nameof(parameter), parameter, null ); } var subpoints = new List <Point3D>(); for (var i = 0; i < 4; ++i) { subpoints.Add(BernsteinPolynomial.Evaluate3DPolynomial( generator(i), firstParameter )); } var derivative = BernsteinPolynomial.CalculateDerivative(subpoints); return((Vector3D)BernsteinPolynomial.Evaluate3DPolynomial( derivative, secondParameter )); }
public void ReshapeEdge( int edgeId, Func <double, Point3D> boundaryCurve, Func <double, Vector3D> boundaryDerivative, Vector3D a0, Vector3D b0, Vector3D a3, Vector3D b3 ) { var c0 = boundaryDerivative(0); var c2 = boundaryDerivative(1); var g0 = (a0 + b0) / 2.0; var g2 = (a3 + b3) / 2.0; var g1 = (g0 + g2) / 2.0; var gPolynomial = new List <Point3D>() { (Point3D)g0, (Point3D)g1, (Point3D)g2 }; double k0, k1, h0, h1; CalculateTangentVectorFieldCoefficients(b0, g0, c0, out k0, out h0); CalculateTangentVectorFieldCoefficients(b3, g2, c2, out k1, out h1); Func <double, double> k = v => k0 * (1 - v) + k1 * v; Func <double, double> h = v => h0 * (1 - v) + h1 * v; Func <double, Vector3D> g = v => (Vector3D)BernsteinPolynomial.Evaluate3DPolynomial( gPolynomial, v ); Func <double, Vector3D> d = v => k(v) * g(v) + h(v) * boundaryDerivative(v); int v0 = 3, v1 = 1, derivativeIndex = 0; if (edgeId == 0) { v0 = 0; v1 = 2; derivativeIndex = 0; } else if (edgeId == 1) { v0 = 1; v1 = 0; derivativeIndex = 1; } else if (edgeId == 2) { v0 = 2; v1 = 3; derivativeIndex = 1; } else if (edgeId == 3) { v0 = 1; v1 = 3; derivativeIndex = 0; } _cornerPoints[v0] = boundaryCurve(0); _cornerPoints[v1] = boundaryCurve(1); _cornerDerivatives[v0, derivativeIndex] = c0; _cornerDerivatives[v1, derivativeIndex] = c2; _cornerTwistVectors[v0, derivativeIndex] = d(1.0 / 3.0); _cornerTwistVectors[v1, derivativeIndex] = d(2.0 / 3.0); }