ViP.at - Bezierkurven
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