示例#1
0
 private void AdjustDerivativeParameter(ref DerivativeParameter parameter)
 {
     if (FlipUV)
     {
         parameter = parameter == DerivativeParameter.U
             ? DerivativeParameter.V
             : DerivativeParameter.U;
     }
 }
示例#2
0
 public static Vector3D Derivative(
     this IParametricSurface surface,
     Parametrisation parametrisation,
     DerivativeParameter parameter
     )
 {
     return(surface.Derivative(
                parametrisation.U,
                parametrisation.V,
                parameter
                ));
 }
示例#3
0
        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);
        }
示例#4
0
        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));
        }
示例#5
0
        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
                       ));
        }
示例#6
0
        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
                          );
            }
        }
示例#7
0
        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));
        }
示例#8
0
 public Vector3D Derivative(
     double u, double v,
     DerivativeParameter parameter)
 {
     throw new NotImplementedException();
 }
示例#9
0
        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);
        }