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