Der folgende Source gibt von 3 Stützpunkten die Koordinaten der fertigen Kurve zurück. Dabei ist dieser Algorithmus für bel. viele Stützpunkte gedacht.
/* ************************************************************************** */ /* Modul zum Erstellen von Kurvem nach Bezier File: Bezier.c */ /* ************************************************************************** */ #define Poly_max 20 /* ************************************************************************** */ /* ************************** Interne Funktionen **************************** */ /* ************************************************************************** */ void comp_Bez_pt (SHORT n, SHORT *xa, SHORT *ya, double u, SHORT *Bez_coeff, SHORT *x, SHORT *y); double Bez_blending_value (SHORT nm1, SHORT k, double u, SHORT *Bez_coeff); void compute_Bez_coefficients (SHORT nm1, SHORT *Bez_coeff); /* ************************************************************************** */ void bezier (SHORT *xa, SHORT *ya, SHORT n, SHORT steps, struct X -mode * mode) { SHORT Bez_coeff[Poly_max]; WORD i, x1, y1, x2, y2; double u; /* fprintf(lfp,"ArrayX: %d %d %d ArrayY: %d %d %d\n",xa[1],xa[2],xa[3],ya[1],ya[2],ya[3]); */ compute_Bez_coefficients (n - 1, Bez_coeff); comp_Bez_pt (n, xa, ya, 0.0, Bez_coeff, &x1, &y1); for (i = 1; i <= steps; i++) { u = (double) (i) / (double) (steps); comp_Bez_pt (n, xa, ya, u, Bez_coeff, &x2, &y2); /* fprintf(lfp,"x1:%d y1:%d x2:%d y2:%d opt:%d Pmode:%d\n",x1,y1,x2,y2,opt,Pmode); */ line (x1, y1, x2, y2, NULL); x1 = x2; y1 = y2; } } void compute_Bez_coefficients (SHORT nm1, SHORT *Bez_coeff) { WORD k, j; for (k = 0; k <= nm1; k++) { Bez_coeff[k] = 1.0; for (j = nm1; j > k; j--) { Bez_coeff[k] *= j; } for (j = nm1 - k; j >= 2; j--) { Bez_coeff[k] /= j; } } } double Bez_blending_value (SHORT nm1, SHORT k, double u, SHORT *Bez_coeff) { double bv, v; WORD i; bv = Bez_coeff[k]; /* fprintf(lfp,"1.bv: %f [k%d]\n",bv,k); */ for (i = 1; i <= k; i++) { bv *= u; } v = 1 - u; for (i = 1; i <= (nm1 - k); i++) { bv *= v; } /* fprintf(lfp,"2.bv: %f \n",bv); */ return (bv); } void comp_Bez_pt (SHORT n, SHORT *xa, SHORT *ya, double u, SHORT *Bez_coeff, SHORT *x, SHORT *y) { SHORT k, nm1; double bv; *x = 0; *y = 0; nm1 = n - 1; for (k = 0; k <= nm1; k++) { bv = Bez_blending_value (nm1, k, u, Bez_coeff); *x = *x + xa[k + 1] * bv; *y = *y + ya[k + 1] * bv; } }
Design by comdes