Le répertoire de travail sera L3PBM

Dessiner une fonction sinus sur une image, créer une librairie pour nous aider à dessiner, des points, des lignes horizontales , verticales , des lignes quelconques

🕒 : 2 x 3 h

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 »

Le  point.

Cette fonction est donnée pour montrer comment faire une fonction en C , rappel surement .. et pour vous lancer

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

Cl3pmb.c

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

/* variable globale du programme */
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;
}


/***************** La fonction principale **********************/
int main()
{

       int x,y;
/* 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 */
point(320,456); /* on utilise notre premiere fonction pour faire un test unitaire*/

/* on place un point sur l'image coordonnées 501,322 pour tester */
point(501,322);

/*Afficher l'image Pbm en ASCII*/
/* en tete de l'image */
printf("P1\n");
/* pas de commentaire dans notre fichier pbm */
/* 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  */

Ecrire une fonction void EffaceImage(void)

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)

Ecrire une fonction void SauveImage(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 pour faire des lignes horizontales.

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 pour faire des lignes verticales.

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)

la fonction , 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 !

void Ligne(int x1,int y1,int x2,int y2)

Dessiner des axes au centre de l’image

si x=800 et y=600  mettre les axes au centre de l’image.

void Axes(int x,int y)

 Tracer un sinus de -PI  / +PI une période complète.

Dans notre image de 800×600 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

Exemple d’utilisation de la fonction sinus en C

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

Résultat:

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$ 
# aide sous linux
man math.h
man sin

Résultat attendu :

Librairie  dorianpbm

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