Différences entre les versions de « Programmation objet et géométrie/Objets en Python sous Gimp/Manipulation de pixels en Python sous Gimp »

Aller à la navigation Aller à la recherche
m
<source> -> <syntaxhighlight> (phab:T237267)
(Annulation des modifications 446698 de CommonsDelinker (discussion))
m (<source> -> <syntaxhighlight> (phab:T237267))
 
Comme les coordonnées sous ''Gimp'' sont entières, on peut représenter graphiquement le [[w:pgcd |pgcd]] de ces coordonnées comme une image 2D. La première ligne sert à expliquer au moteur ''Gimp'' que c'est un filtre ''Python'' qu'on met en place:
 
<sourcesyntaxhighlight lang="python">
#!/usr/bin/env python
 
from math import *
from gimpfu import *
</syntaxhighlight>
</source>
 
Et pendant qu'on y est, on importe les fonctions mathématiques et l'extension ''gimpfu'' (les trois dernières lignes ci-dessus).
Python permet aisément d'affecter simultanément deux variables, ce qui raccourcit considérablement le code (en plus, le test de non-divisibilité de a par b revient au calcul du reste euclidien de a par b, interprété booléennement comme ''faux'' par ''Python'' tant qu'il est non nul):
 
<sourcesyntaxhighlight lang="python">
def gcd(a,b):
while(a%b):
a,b=b,a%b
return b
</syntaxhighlight>
</source>
 
==Création du filtre==
# Enfin on colorie le pixel de coordonnées ''x'' et ''y'' avec la couleur calculée, en appelant pour cela la méthode ''set_pixel'' de l'objet ''calque'' (le premier calque de l'objet ''img'').
 
<sourcesyntaxhighlight lang="python">
def python_pgcd(img) :
largeur=img.width
couleur=(g,0,0)
calque.set_pixel(x,y,couleur)
</syntaxhighlight>
</source>
 
==Enregistrement dans la base de données==
Pour pouvoir tester ce filtre, il est donc nécessaire de l'enregistrer dans la base de données de ''Gimp'' (avant de lancer celui-ci). Ce qui se fait en entrant un texte de ce genre en bas du script:
 
<sourcesyntaxhighlight lang="python">
register(
"pgcd",
python_pgcd,
menu="<Image>/Filters/Render")
</syntaxhighlight>
</source>
 
Le texte entre crochets signifie que la fonction ''python_pgcd'' dont le nom figure juste au-dessous, a une variable (puisque la liste de ses variables ne contient qu'une entrée!), que celle-ci est du type ''PF_IMAGE'', qu'elle s'appelle "img", que son titre est "image vide" et qu'elle n'a pas de valeur par défaut.
Pour finir le script, il reste un appel à la fonction ''main()'':
 
<sourcesyntaxhighlight lang="python">
main()
</syntaxhighlight>
</source>
 
Le tout doit être enregistré dans un fichier texte ayant l'extension ''.py'', dont le bit ''exécutable'' doit être positionné, et placé dans le dossier des filtres ''Gimp''.
Alors, pour tout choix initial de M, le nuage de points ainsi construits se rapproche du triangle de Sierpinski. Pour mieux montrer l'effet du hasard, on donne à M une couleur rouge, verte ou bleue selon le résultat du dé.
 
Pour avoir un nombre pseudoaléatoire égal à 1, 2 ou 3, on écrit en ''Python'' <sourcesyntaxhighlight lang="python">de=ceil(3*random())</sourcesyntaxhighlight> mais cela nécessite qu'on charge préalablement le module ''random'' par <sourcesyntaxhighlight lang="python">from random import *</sourcesyntaxhighlight>
 
Pour raccourcir encore le code, on peut définir une fonction ''Python'' pour calculer les coordonnées du milieu d'un segment. Voici le filtre complet:
 
<sourcesyntaxhighlight lang="python">
#!/usr/bin/env python
 
 
main()
</syntaxhighlight>
</source>
 
En appliquant ce filtre à une image vide de 400 pixels par 400, on obtient la figure suivante:
Pour ce dernier exemple, on va dessiner point par point un triangle, les quantités de rouge, vert et bleu étant les coordonnées barycentriques du pixel dans le triangle. Les sommets du triangle sont A(0,hauteur) qui est tout en bas à gauche (en effet l'axe des ordonnées est dirigé vers le bas), B(largeur,hauteur) qui est en bas à droite et C=(largeur/2,0) qui est donc en haut au milieu. La première boucle est celle sur les ordonnées, qui réalise donc un balayage ligne par ligne (comme dans un écran télé) de haut en bas. Dans cette boucle, on calcule la demi-largeur qui est <math>\frac{y}{hauteur}\frac{largeur}{2}</math>. Mais comme ''y'' est un entier, on veut que ''Python'' le considère comme réel pour que la division des réels lui soit appliquée. On le convertit donc en réel en lui additionnant ''0.0''. De même, la division par 2 est celle par 2.0 pour indiquer que c'est bien par un réel qu'on divise. Mais on va boucler de <math>\frac{largeur}{2}-demilargeur</math> à <math>\frac{largeur}{2}+demilargeur</math>, ce qui nécessite donc que ''demilargeur'' soit un entier! Donc on l'arrondit, ce qui donne
 
<sourcesyntaxhighlight lang="python">
demilargeur=int((y+0.0)/hauteur*largeur/2.)
</syntaxhighlight>
</source>
 
Pour la quantité de bleu, c'est facile, elle est proportionnelle à ''1-y'' (en allant de 0 à 255). Donc les quantités de rouge et de vert s'additionnent à une quantité proportionnelle à ''y''. Cette variable est multipliée par une autre variable appelée ''rv'' (pour ''rouge-vert'') pour avoir la quantité de vert, et par ''1-rv'' pour avoir la quantité de rouge. Ceci illustre l'associativité des barycentres. Donc <math>rv=\frac{x-\frac{largeur}{2}+demilargeur}{2\times demilargeur}</math>. Mais pour convertir ''x'' en réel, on ajoute 0.0 au numérateur,et pour éviter le risque de diviser par 0, on ajoute un nombre petit mais positif au dénominateur:
 
<sourcesyntaxhighlight lang="python">
rv=(x-largeur/2+demilargeur+0.0)/2/(demilargeur+0.000001)
</syntaxhighlight>
</source>
 
Finalement le script complet donne ceci:
 
<sourcesyntaxhighlight lang="python">
#!/usr/bin/env python
 
 
main()
</syntaxhighlight>
</source>
 
En appliquant ce filtre à une image vide de 400 pixels par 400, on obtient le [[w:triangle de Maxwell|triangle des couleurs]] que voici:
1 535

modifications

Menu de navigation