Mathc gnuplot/Application : Courbe de Bézier rationnelle
Les courbes de Béziers dans Wikipedia.
Préambule Modifier
Courbes de Béziers rationelles (cubiques) Modifier
La seule chose qui change avec le chapitre précédent, c'est le fichier "kpoly.h".
Présentation Modifier
N'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 Modifier
Nous 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 Modifier
x_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();
}