コード例 #1
0
        public override Vector2d GetThirdDerivative(double t)
        {
            CurveDerivatives cd = new CurveDerivatives();

            cd.init(false, false, false, true);
            Get(t, ref cd);
            return(cd.d3);
        }
コード例 #2
0
        public override Vector2D GetSecondDerivative(double t)
        {
            CurveDerivatives cd = new CurveDerivatives();

            cd.init(false, false, true, false);
            Get(t, ref cd);
            return(cd.d2);
        }
コード例 #3
0
        public void Get(double t, ref CurveDerivatives result)
        {
            int i, imin = 0, imax = 0;

            if (result.bDer3)
            {
                mBasis.Compute(t, 0, ref imin, ref imax);
                mBasis.Compute(t, 1, ref imin, ref imax);
                mBasis.Compute(t, 2, ref imin, ref imax);
                mBasis.Compute(t, 3, ref imin, ref imax);
            }
            else if (result.bDer2)
            {
                mBasis.Compute(t, 0, ref imin, ref imax);
                mBasis.Compute(t, 1, ref imin, ref imax);
                mBasis.Compute(t, 2, ref imin, ref imax);
            }
            else if (result.bDer1)
            {
                mBasis.Compute(t, 0, ref imin, ref imax);
                mBasis.Compute(t, 1, ref imin, ref imax);
            }
            else    // pos
            {
                mBasis.Compute(t, 0, ref imin, ref imax);
            }

            double tmp;

            // Compute position.
            Vector2d X = Vector2d.Zero;
            double   w = (double)0;

            for (i = imin; i <= imax; ++i)
            {
                tmp = mBasis.GetD0(i) * mCtrlWeight[i];
                X  += tmp * mCtrlPoint[i];
                w  += tmp;
            }
            double   invW = 1.0 / w;
            Vector2d P    = invW * X;

            result.p         = P;
            result.bPosition = true;

            if (result.bDer1 == false && result.bDer2 == false && result.bDer3 == false)
            {
                return;
            }

            // Compute first derivative.
            Vector2d XDer1 = Vector2d.Zero;
            double   wDer1 = (double)0;

            for (i = imin; i <= imax; ++i)
            {
                tmp    = mBasis.GetD1(i) * mCtrlWeight[i];
                XDer1 += tmp * mCtrlPoint[i];
                wDer1 += tmp;
            }
            Vector2d PDer1 = invW * (XDer1 - wDer1 * P);

            result.d1    = PDer1;
            result.bDer1 = true;

            if (result.bDer2 == false && result.bDer3 == false)
            {
                return;
            }

            // Compute second derivative.
            Vector2d XDer2 = Vector2d.Zero;
            double   wDer2 = (double)0;

            for (i = imin; i <= imax; ++i)
            {
                tmp    = mBasis.GetD2(i) * mCtrlWeight[i];
                XDer2 += tmp * mCtrlPoint[i];
                wDer2 += tmp;
            }
            Vector2d PDer2 = invW * (XDer2 - ((double)2) * wDer1 * PDer1 - wDer2 * P);

            result.d2    = PDer2;
            result.bDer2 = true;

            if (result.bDer3 == false)
            {
                return;
            }

            // Compute third derivative.
            Vector2d XDer3 = Vector2d.Zero;
            double   wDer3 = (double)0;

            for (i = imin; i <= imax; i++)
            {
                tmp    = mBasis.GetD3(i) * mCtrlWeight[i];
                XDer3 += tmp * mCtrlPoint[i];
                wDer3 += tmp;
            }
            result.d3 = invW * (XDer3 - ((double)3) * wDer1 * PDer2 -
                                ((double)3) * wDer2 * PDer1 - wDer3 * P);
        }