public override Vector2d GetThirdDerivative(double t) { CurveDerivatives cd = new CurveDerivatives(); cd.init(false, false, false, true); Get(t, ref cd); return(cd.d3); }
public override Vector2D GetSecondDerivative(double t) { CurveDerivatives cd = new CurveDerivatives(); cd.init(false, false, true, false); Get(t, ref cd); return(cd.d2); }
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); }