09/11/2020
Prérequis
Découverte du format image en ASCII PBM, gcc langage C de base
Cours sur les fichiers. (open)
But
Création de fonctions faites maison (librairie) , ici la lib "dorianpbm"
Cette fonction est donnée pour montrer comment faire une fonction en C , rappel surement ..
/** point description *******************************************/
/* point(x,y) , place un point sur l'image a la coordonnée x,y */
/* retourne 0 si ok 1 sinon */
/****************************************************************/
int point(int x,int y)
Solution pour démarrer à l'aide du projet sur github:
sudo apt update && sudo apt install git -y
git config --global http.proxy 10.0.0.1:3128
git clone https://github.com/CarolineDorian/l3pbm.git
/******************************************/
/** Image avec points de 800 x 600 **/
/** V1.Bogt2020 LtDorian **/
/** 09/11/2020 **/
/******************************************/
#include<stdio.h>
#include<stdlib.h>
#define largeur 800
#define hauteur 600
char image[largeur][hauteur]; /* representation de notre image */
/* nos fonctions */
/** point description *******************************************/
/* point(x,y) , place un point sur l'image a la coordonnée x,y */
/* retourne 0 si ok 1 sinon */
/****************************************************************/
int point(int x,int y)
{
/* on teste si nous sommes bien dans le tableau sinon on retourne 1 */
if ((x<0) || (x>=largeur))
{
fprintf(stderr,"On sort de l'image !\n");
return EXIT_FAILURE;
}
if ((y<0) || (y>=hauteur))
{
fprintf(stderr,"On sort de l'image !\n");
return EXIT_FAILURE;
}
image[x][y]='1';
return EXIT_SUCCESS;
}
/************************* principale *****************************/
int main()
{
int x,y; /* variable locale a la fonction main */
/* Dans la fonction main on va : */
/* remplir le tableau de '0' pour faire une image blanche */
for (y=0; y <hauteur ; y++) /* pour toutes les lignes */
for (x=0; x<largeur ; x++) /* pour chaque colonnes */
image[x][y]='0'; /* mettre un pixel blanc */
/* on place un point sur l'image coordonnées 320,456 pour faire un premier test */
point(320,456); /* on utilise notre première fonction pour faire un test unitaire*/
/* on place un point sur l'image coordonnées 501,322 pour tester encore */
point(501,322);
/*Afficher l'image Pbm en ASCII*/
/* en tete de l'image */
printf("P1\n");
/* pas de commentaire */
/* on donne les coordonnées en décimal dans l’entête */
printf("%d %d\n",largeur,hauteur);
/* on place tous les pixels */
for (y=0; y <hauteur ; y++) /* pour toutes les lignes */
for (x=0; x<largeur ; x++) /* pour chaque colonnes */
printf ("%c \n",image[x][y]);
return EXIT_SUCCESS;
}
/* faire un fichier pbm avec ce qui s'affiche */
/* ./bitmap > bitmap.pbm */
Code de départ pour faire un copier coller plus simple!
Actuellement le main réalise le remplissage de 0 dans le tableau contenant l'image.
Pour améliorer le code on va réaliser une fonction EffaceImage qui sera une fonction qui efface en blanc toute l'image.
Réaliser un main ou on testera cette nouvelle fonction.
Modifier le code précédent pour intégrer dans cette fonction.
void EffaceImage(void)
Avec vos connaissances sur les fichiers , écrire une fonction qui crée le fichier image.pbm dans le répertoire courant de votre projet.
void SauveImage(void)
Ecrire une fonction qui dessine une ligne horizontale dans l'image , qui utilise la fonction point réalisée précédemment.
réaliser un test unitaire de votre fonction, avec un main approprié.
void LigneHorizontale(int x,int y,int nbpixel)
Ecrire une fonction qui dessine une ligne verticale dans l'image , qui utilise la fonction point réalisée précédemment.
réaliser un test unitaire de votre fonction, avec un main approprié.
void LigneVerticale(int x,int y,int nbpixel)
void Ligne(int x1,int y1,int x2,int y2)
permet de tracer une ligne du point 1 au point 2
Mr Bresenham y a réfléchit déjà pour vous
wikipedia anglais de Bresenham
Et pour vous aider , une proposition de solution ici !
si x=800 et y=600 mettre les axes au centre de l'image.
void Axes(int x,int y)
Dans notre image de 800x600 dessiner un belle fonction sinus , attention la fonction est en pi radian
la librairie mathématique
#include <math.h>
et ajouter -lm comme option à gcc pour utiliser cette librairie.
man sin
et ne plus mettre l'option -ansi lors de la compilation pour utiliser math.h
bruno@bruno-MS-7851:~/Works/Code_C/sinus$ more sinus.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc,char **argv)
{
printf ("sin(pi)=%f\n",sin(M_PI));
printf ("sin(pi/2)=%f\n",sin(M_PI/2));
return EXIT_SUCCESS;
}
bruno@bruno-MS-7851:~/Works/Code_C/sinus$ gcc sinus.c -o sinus -lm -pedantic -g -Wall
bruno@bruno-MS-7851:~/Works/Code_C/sinus$ ./sinus
sin(pi)=0.000000
sin(pi/2)=1.000000
bruno@bruno-MS-7851:~/Works/Code_C/sinus$
man math.h
man sin
Résultat attendu :
Réaliser le librairie dorianpbm (dorianpbm.c et dorianpbm.h)
avec un fichier README qui expliquera le projet et comment le compiler.
Donner le projet complet (makefile et lib) le tout dans un répertoire imagepbm --> imagepbm.tar