Mathc gnuplot/Application : Courbe de Bézier rationnelle
Les courbes de Béziers dans Wikipedia.
Préambule
modifierCourbes de Béziers rationelles (cubiques)
modifierLa seule chose qui change avec le chapitre précédent, c'est le fichier "kpoly.h".
Présentation
modifierN'oubliez pas les fichiers *.h partagés et ceux de ce chapitre.
c01.c Exemple à tester |
---|
/* ------------------------------------ */
/* Save as : c01.c */
/* ------------------------------------ */
#include "x_ahfile.h"
/* ------------------------------------ */
int main(void)
{
printf(" Une courbe de Bezier.\n\n");
G_quadratic_Bezier_lp_2d(
i_WGnuplot(-10,90,-10,50),
i_point2d(20.,10.),
i_point2d(40.,40.),
i_point2d(60.,10.)
);
printf("\n\n load \"a_main.plt\" with gnuplot."
"\n\n Press return to continue");
return 0;
}
Résultat dans gnuplot |
---|
Courbe du chapitre précédent |
---|
Une application
modifierNous avons essayé de recouvrir un quart de cercle avec une courbe de Béziers. En théorie cela est possible avec les courbes de Béziers rationelles (cubiques).
c02.c Exemple à tester |
---|
/* ------------------------------------ */
/* Save as : c02.c */
/* ------------------------------------ */
#include "x_ahfile.h"
/* ------------------------------------ */
int main(void)
{
printf(" Une courbe de Bezier.\n\n");
G_quadratic_Bezier_lp_2d(
i_WGnuplot(-0,2,-0,1),
i_point2d(0.,1.),
i_point2d(1.,1.),
i_point2d(1.,0.)
);
printf("\n\n load \"a_main.plt\" with gnuplot."
"\n\n Press return to continue");
return 0;
}
Résultat dans gnuplot |
---|
Courbe du chapitre précédent |
---|
Les fichiers h de ce chapitre
modifierx_ahfile.h Appel des fichiers |
---|
/* ------------------------------------ */
/* Save as : x_ahfile.h */
/* ------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <math.h>
#include <string.h>
/* ------------------------------------ */
#include "xdef.h"
#include "xplt.h"
#include "xspv.h"
/* ------------------------------------ */
#include "kpoly.h"
#include "kbezier.h"
Cette partie ne peut être vue que dans wikiversité.
kpoly.h Les équations de la courbe |
---|
/* ------------------------------------ */
/* Save as : kpoly.h */
/* ------------------------------------ */
double quadratic_Bezier_x_2d(
double t,
point2d P0,
point2d P1,
point2d P2
)
{
return(
(
P0.x * pow((1-t),2) * pow(t,0) +
2 * P1.x * pow((1-t),1) * pow(t,1) +
2 * P2.x * pow((1-t),0) * pow(t,2)
)
/
(
pow((1-t),2) * pow(t,0) +
2 * pow((1-t),1) * pow(t,1) +
2 * pow((1-t),0) * pow(t,2)
)
);
}
/* ------------------------------------ */
double quadratic_Bezier_y_2d(
double t,
point2d P0,
point2d P1,
point2d P2)
{
return(
(
P0.y * pow((1-t),2) * pow(t,0) +
2 * P1.y * pow((1-t),1) * pow(t,1) +
2 * P2.y * pow((1-t),0) * pow(t,2)
)
/
(
pow((1-t),2) * pow(t,0) +
2 * pow((1-t),1) * pow(t,1) +
2 * pow((1-t),0) * pow(t,2)
)
);
}
/* ------------------------------------ */
kbezier.h La fonction graphique |
---|
/* ------------------------------------ */
/* Save as : kbezier.h */
/* ------------------------------------ */
void G_quadratic_Bezier_lp_2d(
W_Ctrl w,
point2d P0,
point2d P1,
point2d P2
)
{
FILE *fp;
double mini = 0.;
double maxi = 1.;
double step = .01;
double t = mini;
fp = fopen("a_main.plt","w");
fprintf(fp," set zeroaxis lt 8\n"
" set grid \n\n"
" set size ratio -1\n"
" plot [%0.3f:%0.3f] [%0.3f:%0.3f] \\\n"
" \"a_pts\" with linesp lt 3 pt 1, \\\n"
" \"a_ctrlpt\" with linesp lt 4 pt 4 \\\n\n"
" reset",w.xmini,w.xmaxi,w.ymini,w.ymaxi);
fclose(fp);
fp = fopen("a_pts","w");
for(t=mini; t<=maxi; t+=step)
fprintf(fp," %6.5f %6.5f\n",quadratic_Bezier_x_2d(t,P0,P1,P2),
quadratic_Bezier_y_2d(t,P0,P1,P2));
fclose(fp);
fp = fopen("a_ctrlpt","w");
fprintf(fp," %6.5f %6.5f\n",P0.x,P0.y);
fprintf(fp," %6.5f %6.5f\n",P1.x,P1.y);
fprintf(fp," %6.5f %6.5f\n",P2.x,P2.y);
fclose(fp);
Pause();
}