/** Calculates the tangent for a given point on a bezier curve * @param p x- or y-values of four points describing the bezier * @param u position on the curve between[0 .. 1] * @return the x- or y-part of the tangent vector */ real bezier_eval_tangent(const real p[4], real u) { real A,B,C,D; bernstein_develop(p,&A,&B,&C,&D); return 3*A*u*u+2*B*u+C; }
/** Evaluates the Bernstein polynoms for a given position * @param p x- or y-values of four points describing the bezier * @param u position on the curve [0 .. 1] * @returns the evaluate x- or y-part of the point */ real bezier_eval(const real p[4], real u) { real A,B,C,D; bernstein_develop(p,&A,&B,&C,&D); return A*u*u*u+B*u*u+C*u+D; }
int bicubicbezier_extrema(const double p[4],double u[2]) { double A,B,C,D,delta; bernstein_develop(p,&A,&B,&C,&D); delta = 4*B*B - 12*A*C; u[0] = u[1] = 0.0; if (delta<0) return 0; u[0] = (-2*B + sqrt(delta)) / (6*A); if (delta==0) return 1; u[1] = (-2*B - sqrt(delta)) / (6*A); return 2; }
/** * Calculates the extrma of the given curve in x- or y-direction. * @param p x- or y-values of four points describing the bezier * @param u The position of the extrema [0 .. 1] * @return The number of extrema found. */ static int bicubicbezier_extrema(const real p[4],real u[2]) { real A,B,C,D,delta; bernstein_develop(p,&A,&B,&C,&D); delta = 4*B*B - 12*A*C; u[0] = u[1] = 0.0; if (delta<0) return 0; /* just a quadratic contribution? */ if (fabs(A) < 1e-6) { u[0] = -C/(2*B); return 1; } u[0] = (-2*B + sqrt(delta)) / (6*A); if (delta==0) return 1; u[1] = (-2*B - sqrt(delta)) / (6*A); return 2; }
double bezier_eval_tangent(const double p[4], double u) { double A,B,C,D; bernstein_develop(p,&A,&B,&C,&D); return 3*A*u*u+2*B*u+C; }
double bezier_eval(const double p[4], double u) { double A,B,C,D; bernstein_develop(p,&A,&B,&C,&D); return A*u*u*u+B*u*u+C*u+D; }