Le Graphisme

From PilibWiki

Jump to: navigation, search

Section Précédente : Les Bases pour programmer avec PILIB | | Retour au sommaire | | Section Suivante : Exemples





Dans cette section, nous allons nous atteler à créer une zone graphique. Cette zone graphique doit pour le moment inclure les éléments suivants : Des vecteurs, des points, des chiffres, des lettres, des rectangles, et des images. Nous verrons donc ces éléments aux complets, en espérant que cela vous suffira. D'autres éléments sont susceptibles d'apparaître par la suite avec les nouvelles versions de PILIB.



Contents

La Zone graphique

Premier élément de votre sublime graphique, la zone de graphique correspond à une zone de votre fenêtre alloué au dessin ou à l'affichage d'une image. Cette zone possède les même propriétés qu'un container mais avec le tracé de vecteurs, de points, ou de rectangles. Je vous conseille fortement d'allouer un container entier à cette zone graphique pour ne pas vous perdre par la suite. Un dernier conseil : prenez bien en compte que les coordonnées dans la zone graphique sont celles d'un repère orthonormé standard. L'axe des abscisses x commence donc en bas à gauche et finit en bas à droite. L'axe des ordonnées y commence en bas à gauche et finit en haut à gauche.


Repère de la zone graphique
Repère de la zone graphique


La subroutine gkgraph est structuré de cette manière :


gkgraph(nx,ny,fenêtre,nomgraph,nomzone)

nx, ny 
taille de la zone graphique.
fenêtre 
nom de la fenêtre cible.
nomgraph 
nom de la zone graphique (utilisé pour tracer).
nomzone 
nom de la zone graphique en temps qu'objet (utilisé pour la mettre dans un container).


exemple :


program graphique
use pimod

implicit none

integer(kind=kptr) :: Win,iclos,graphcontain,plot1,graph1

call piinit
call gkwindow(c('graphique'),0,0,Win,iclos)

call gkcontain(1,0,0,3,graphcontain)

call gkgraph(300,300,Win,plot1,graph1)

call gkput(0,0,-1,-1,graphcontain,graph1)
call gkput(0,0,-1,-1,Win,graphcontain)

call gkshow(Win)

DO WHILE(iclos.eq.0)
	call gkproc
END DO

call gkdestroy(Win)

end program graphique

Et vous devriez obtenir une horreur de ce genre, c'est normal pour le moment.


Zone graphique vierge
Zone graphique vierge


Les Couleurs

Avant d'attaquer le reste, une rapide explication sur les couleurs. Dans PILIB, la gestion des couleurs se fait par l'intermédiaire d'un integer. La formule est la suivante :

couleur = ((ROUGE*256)+VERT)*256+BLEU

Pour avoir du rouge, ROUGE = 255, VERT = 0, BLEU = 0. Pour avoir du vert, ROUGE = 0, VERT = 255, BLEU = 0. Pour avoir du bleu, ROUGE = 0, VERT = 0, BLEU = 255.

Les nuances viennent ensuite en ajoutant les valeurs. Par exemple, pour ceux qui on la fibre artistique, si vous mélangez du bleu et du rouge, vous obtenez du ..... Violet, bravo !

Pour avoir du violet, ROUGE = 255, VERT = 0, BLEU = 255.

Pour avoir du noir, ROUGE = 0, VERT = 0, BLEU = 0. Pour avoir du blanc, ROUGE = 255, VERT = 255, BLEU = 255.

Et ainsi de suite.

Si comme moi vous n'avez jamais été doué en arts plastique, je vous invite à vous rendre sur cette page. Vous y trouverez toutes les couleurs nécéssaires. Les valeurs RGB sont dans la 2iéme colonne de chaque tableau.


Couleurs RGB

Le rectangle

Vous vous demandez sûrement pourquoi le rectangle avant les vecteurs ? Et bien simplement que grâce à ces rectangles, vous allez pouvoir initialiser votre zone graphique. Au démarrage, vous avez pus le voir, la zone graphique ne ressemble à rien. Nous allons donc l'initialiser en blanc, en dessinant dessus une rectangle blanc qui la recouvre.

La subroutine grrect est structuré de cette manière :


grrect(ix1,iy1,ix2,iy2, couleur, nomgraph)

ix1, iy1 
coordonnées du sommet en bas à gauche du rectangle.
ix2, iy2 
coordonnées du sommet en haut à droite du rectangle.
couleur 
couleur du rectangle.
nomgraph 
nom de la zone graphique ciblée.


exemple :

program graphique
use pimod
implicit none
integer(kind=kptr) :: couleurfond = ((255*256)+255)*256+255
integer(kind=kptr) :: couleurnoir =  ((0*256)+0)*256+0
integer(kind=kptr) :: Win,iclos,graphcontain,graph1,plot1

call piinit
call gkwindow(c('graphique'),0,0,Win,iclos)

call gkcontain(1,0,0,3,graphcontain)

call gkgraph(300,300,Win,plot1,graph1)

call grrect(0,0,300,300,couleurfond,plot1)
call grrect(100,100,200,200,couleurnoir,plot1)


call gkput(0,0,-1,-1,graphcontain,graph1)
call gkput(0,0,-1,-1,Win,graphcontain)

call gkshow(Win)

DO WHILE(iclos.eq.0)
	call gkproc
END DO

call gkdestroy(Win)

end program graphique


Rectangles de bases de PILIB
Rectangles de bases de PILIB

Les Vecteurs

Nous voici dans la partie la plus importante, les vecteurs étant à la base de tout tracé scientifique. Le principe n'est pas bien compliqué. Nous allons tout d'abord tracer un simple vecteur, puis essayer de faire un jolie panneau par exemple.

La subroutine grvect est structuré de cette manière :


grvect(ix1,iy1,ix2,iy2, couleur, nomgraph)

ix1, iy1 
coordonnées du début du vecteur.
ix2, iy2 
coordonnées de la fin du vecteur.
couleur 
couleur du rectangle.
nomgraph 
nom de la zone graphique ciblée.


exemple :

program graphique
use pimod

integer(kind=kptr) :: couleurfond = ((255*256)+255)*256+255
integer(kind=kptr) :: couleurnoir =  ((0*256)+0)*256+0
integer(kind=kptr) :: Win,iclos,graphcontain,plot1,graph1

call piinit
call gkwindow(c('graphique'),0,0,Win,iclos)

call gkcontain(1,0,0,3,graphcontain)

call gkgraph(300,300,Win,plot1,graph1)

call grrect(0,0,300,300,couleurfond,plot1)
call grvect(100,100,200,200,couleurnoir,plot1)


call gkput(0,0,-1,-1,graphcontain,graph1)
call gkput(0,0,-1,-1,Win,graphcontain)

call gkshow(Win)

DO WHILE(iclos.eq.0)
	call gkproc
END DO

call gkdestroy(Win)

end program graphique


Vecteur de base de PILIB
Vecteur de base de PILIB


exemple : un panneau

program graphique
use pimod

integer(kind=kptr) :: couleurfond = ((255*256)+255)*256+255
integer(kind=kptr) :: cnoir =  ((0*256)+0)*256+0,crouge = ((255*256)+0)*256+0
integer(kind=kptr) :: rayon=100,Xc=150,Yc=150,x1,y1plus,y1moins
integer(kind=kptr) :: x2,y2plus,y2moins,x

call piinit
call gkwindow(c('graphique'),0,0,ihwin,iclos)

call gkcontain(1,0,0,3,ihgraphcontain)

call gkgraph(300,300,ihwin,ihplot1,ihgraph1)

call grrect(0,0,300,300,couleurfond,ihplot1)

!!! Cercle
do x=-rayon,rayon-1

	x1=x+Xc
	y1plus=int((SQRT(rayon*rayon*1.0-x*1.0*x)+Yc*1.0))
	x2=x+1+Xc
	y2plus=int(SQRT(rayon*rayon*1.0-1.0*(x+1)*(x+1))+Yc)

	y1moins=int((-1.0*SQRT(rayon*rayon*1.0-x*1.0*x)+Yc*1.0))
	y2moins=int(-1.0*SQRT(rayon*rayon*1.0-1.0*(x+1)*(x+1))+Yc)

	if (x/=-rayon) then         !!! Surface rouge
	    call grvect(x1,y1plus,x1,y1moins,crouge,ihplot1)
	end if
        !!!Cercle noir partie du dessus
	call grvect(x1,y1plus,x2,y2plus,cnoir,ihplot1)
        !!!Cercle noir partie du dessous   
	call grvect(x1,y1moins,x2,y2moins,cnoir,ihplot1)     

end do

call grrect(90,135,210,165,couleurfond,ihplot1)


call gkput(0,0,-1,-1,ihgraphcontain,ihgraph1)
call gkput(0,0,-1,-1,ihwin,ihgraphcontain)

call gkshow(ihwin)

DO WHILE(iclos.eq.0)
	call gkproc
END DO

call gkdestroy(ihwin)

end program graphique


Un exemple d'application
Un exemple d'application

Les Points

Nouveau dans la 3.0, donc à venir...

Les Images

Nous abordons une autre partie intéressante qu'est l'affichage d'image par l'intermédiaire d'une zone graphique.


Buffer

Première étape, créer un buffer afin de stocker l'image.

La subroutine grpixbuf est structuré de cette manière :


grpixbuf(nx,ny,nom)

nx, ny 
taille du buffer (soit celle de l'image).
nom 
nom du buffer.


LoadBuffer

Seconde étape, charger l'image dans le buffer créé précédement.

La subroutine grpixbufload est structuré de cette manière :


grpixbufload(image,buffer,ierr)

image 
nom de l'image à charger et chemin d'accès. Par exemple, si l'image est placé dans le même répertoire que le fichier à compiler, tapez : c('image.jpg').
buffer 
nom du buffer cible.
ierr 
integer prenant la valeur 0 si le chargement s'est bien effectué (il a trouvé l'image) ou une autre valeur si il y eu le moindre pépin.


Insertion dans la zone graphique

On crée ensuite une zone graphique (comme précédemment) puis l'on vas insérer l'image dedans.

La subroutine grpixbufput est structuré de cette manière :


grpixbufput(ix,iy,kx,ky,nx,ny, buffer, graph)

ix,iy 
coordonnées du sommet supérieur gauche à partir duquel il faut copier dans l'image source.
kx,ky 
coordonnées du sommet supérieur gauche à partir duquel il faut coller dans la zone graphique.
nx,ny 
taille de la zone à copier en pixels ou -1 pour tout copier (toute l'image).
buffer 
nom du buffer source.
graph 
nom de la zone graphique cible.




Exemple

Afin d'illustrer explicitement ce que nous avons vu précédemment, voici un petit exemple utilisant une image, un container, 2 souscontainers, et un texte.

program images
use pimod
implicit none

integer(kind=kptr) :: ierr
integer(kind=kptr) :: Win,iclos,contain,containImage
integer(kind=kptr) :: containTexte,pixbuf,plot1,graph1,Text

call piinit
call gkwindow(c('image'),0,0,Win,iclos)
call gkcontain(1,0,0,3,contain)
call gkcontain(1,0,0,3,containImage)
call gkcontain(1,0,0,3,containTexte)

call grpixbuf(265,300,pixbuf)
call grpixbufload(c('Lamella_exc_1.png'),pixbuf,ierr)
print *,"code d'erreur : ",ierr

call gkgraph(265,300,Win,plot1,graph1)

call grpixbufput(0,0,0,0,265,300,pixbuf,plot1)

call gkput(0,0,-1,-1,containImage,graph1)
call gkput(0,0,-1,-1,contain,containImage)

call gktext(c('Ceci est echangeur de chaleur'),Text)
call gkput(0,130,-1,-1,containTexte,Text)
call gkput(320,0,-1,-1,contain,containTexte)

call gkput(0,0,-1,-1,Win,contain)

call gkshow(Win)


DO WHILE(iclos.eq.0)
	call gkproc
END DO

call gkdestroy(Win)

end program images


Résultat d'affichage avec PILIB (Author : R. Castelnuovo (myself) 2005 07 29; GNU Liscence)
Résultat d'affichage avec PILIB (Author : R. Castelnuovo (myself) 2005 07 29; GNU Liscence)


Section Précédente : Les Bases pour programmer avec PILIB | | Retour au sommaire | | Section Suivante : Exemples

Personal tools