private void AdjustDerivativeParameter(ref DerivativeParameter parameter) { if (FlipUV) { parameter = parameter == DerivativeParameter.U ? DerivativeParameter.V : DerivativeParameter.U; } }
public static Vector3D Derivative( this IParametricSurface surface, Parametrisation parametrisation, DerivativeParameter parameter ) { return(surface.Derivative( parametrisation.U, parametrisation.V, parameter )); }
public void DrawDerivative( IParametricSurface surface, double u, double v, DerivativeParameter parameter, Color?color = null ) { var point = surface.Evaluate(u, v); var derivative = surface.Derivative(u, v, parameter); DrawVector(point, derivative, derivative.Length, color); }
public Vector3D Derivative( double u, double v, DerivativeParameter parameter) { AdjustCoorinates(ref u, ref v); AdjustDerivativeParameter(ref parameter); var flip = (FlipU && parameter == DerivativeParameter.U) || (FlipV && parameter == DerivativeParameter.V); var flipFactor = flip ? -1.0 : 1.0; return(flipFactor * Surface.Derivative(u, v, parameter)); }
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 Vector3D Derivative( double u, double v, DerivativeParameter parameter ) { switch (parameter) { case DerivativeParameter.U: return(DerivativeU(u, v)); case DerivativeParameter.V: return(DerivativeV(u, v)); default: throw new ArgumentOutOfRangeException( nameof(parameter), parameter, null ); } }
public Vector3D Derivative( double u, double v, DerivativeParameter parameter ) { double patchU, patchV; var patch = GetPatchWithAdjustedCoords( u, v, out patchU, out patchV ); double innerDerivative; switch (parameter) { case DerivativeParameter.U: innerDerivative = SegmentsU; break; case DerivativeParameter.V: innerDerivative = SegmentsV; break; default: throw new ArgumentOutOfRangeException( nameof(parameter), parameter, null ); } return(innerDerivative * patch.Derivative(patchU, patchV, parameter)); }
public Vector3D Derivative( double u, double v, DerivativeParameter parameter) { throw new NotImplementedException(); }
private DenseVector EvaluateNumericalDerivativeForPlaneEquation( IParametricSurface surface, Parametrisation parametrisation, Vector previousPoint, Vector tangentVector, DerivativeParameter parameter ) { var parametrisationStep = 0.01; Parametrisation newParametrisation; switch (parameter) { case DerivativeParameter.U: if (parametrisation.U > 1 - parametrisationStep - 0.001) { parametrisationStep = -parametrisationStep; } newParametrisation = parametrisation + new Parametrisation( parametrisationStep, 0.0 ); break; case DerivativeParameter.V: if (parametrisation.V > 1 - parametrisationStep - 0.001) { parametrisationStep = -parametrisationStep; } newParametrisation = parametrisation + new Parametrisation( 0.0, parametrisationStep ); break; default: throw new ArgumentOutOfRangeException( nameof(parameter), parameter, null ); } var currentValues = EvaluatePlaneEquation( surface, parametrisation, previousPoint, tangentVector ); var shiftedValues = EvaluatePlaneEquation( surface, newParametrisation, previousPoint, tangentVector ); return((shiftedValues - currentValues) / parametrisationStep); }