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;
  }
}

© 1995 by Thomas Dorn
Design by comdes