コード例 #1
0
        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));
        }
コード例 #2
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
                       ));
        }
コード例 #3
0
ファイル: GregoryPatch.cs プロジェクト: sienkiewiczkm/cadio
        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);
        }