/* Exercice V, feuille d'exercices 5 */
/* Solution proposee par Benjamin Beloin */

#include<stdio.h>

#define nb_param 16

typedef struct P
{
  double abs,ord;
}Point;

void casteljau(int a,int nbre_points,Point *pt);


main()
{
  int k=0,i=0,nb_pts=0;
  Point *P,*P_copy;

  /* Demande du nombre de points a utiliser et allocation en memoire des tableaux d'abscisses et d'ordonnees en fonction de ce nombre */
  printf ("Combien de points voulez vous utiliser? ");
  scanf("%d",&nb_pts);
  P=(Point*)malloc(nb_pts*sizeof(Point));
  P_copy=(Point*)malloc(nb_pts*sizeof(Point));

  /* Saisie des coordonnees des points */  
  for (i=0;i<nb_pts;i++)
    {
      printf ("\nAbcisse du point x%d: ",i);
      scanf ("%lf",&P[i].abs);
      printf ("Ordonnee du point y%d: ",i);
      scanf ("%lf",&P[i].ord);
    }
      

  /* Calcul des points selon l'algorithme de casteljau pour chaque valeur du parametre */
  for(k=0;k<=nb_param;k++) 
    { 
      /* Copie du tableau de structures P pour recuperer les valeurs originales pour chaque iteration correspondant a chaque valeur du parametre lors du calcul selon l'algorithme de casteljau */
      for (i=0;i<nb_pts;i++)
	{
	  P_copy[i].abs=P[i].abs;
	  P_copy[i].ord=P[i].ord;
	}
      casteljau(k,nb_pts,P_copy);
      /* Affichage des coordonnees du point de la courbe de Bezier correspondant au parametre t=k/nb_param */
      printf("\nPoint de la courbe de Bezier pour t=%lf: (%lf,%lf)",(double)k/nb_param,P_copy[0].abs,P_copy[0].ord);
    }
  printf("\n");
}


void casteljau(int a,int nbre_points,Point *pt)
{
  int i,j;
  double t=((double)a)/((double)nb_param);
  for(j=1;j<nbre_points;j++)
    {
      for(i=0;i<nbre_points-j;i++)
	{
	  pt[i].abs = (1-t)*pt[i].abs + t*pt[i+1].abs;
	  pt[i].ord = (1-t)*pt[i].ord + t*pt[i+1].ord;
	}
    }
}