Le Graphisme
From PilibWiki
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.
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.
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.
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
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
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
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
Section Précédente : Les Bases pour programmer avec PILIB | | Retour au sommaire | | Section Suivante : Exemples







