Historique de dévelopement de Libxy
Pérégrinations informatico-mathématiques
Deux principaux objectifs initialement:
- fournir une bibiliothèque de fonctions graphiques faciles à utiliser, permettant de se concentrer lors de l'apprentissage de l'algorithmique et la programmation sur le fond algorithmique plus que sur la forme, syntaxe, langage, …
- fournir une bibiliothèque python utilisable sous la plus large plage possible d'environnement, en particulier les environnements portables et tactiles: Android donc principalement.
Pour arriver à cette bibliothèque, de nombreuses encombres: mathématiques et informatiques (programmation).
Presque dans l'ordre chronologique:
- Problème informatique 1: Sous Android, python est disponible (librement et gratuitement, via par exemple qpython), mais pas les bibliothèques usuelles dont celles graphiques comme mathplotlib (les bibliothèques écrites en langage C sont assez difficiles à adapter et compiler dans un environnement plus léger comme Android).
Première étape donc, écrire une bibliothèque graphique utilisable sous Android (les autres environnements découleront certainement alors...).
La bibliothèque PIL (Python Imaging Library) est disponible nativemen avec qpython sous Android (qpython pas qpython3, pour laquelle la bibliothèque s'apelle maintenant Pillow mais n'est pas disponible).
Cela amène la version Libxy(Pil) jusqu'à 1.3, reposant sur PIL et fontionnelle donc dès que PIL (ou Pillow) l'est.
- Problèmes mathématiques:
- changement du système de coordonnées: cf. ces détails, en javascript dans un
canvas
, mais les opérations sont mathématiques donc largement indépendantes du seul langage de programmation.
Dans une image les coordonnées d'un point sont mesurées en pixels, depuis, en général, le coin haut gauche qui est l'origine (0;0).
Ce repère n'est pas toujours pertinent…
- Problème informatique 2: PIL n'est pas disponible dans tous les environnements, qpython non plus (sur tablette par exemple, qpython n'est pas toujours installable). De plus Pillow (PIL moderne pour python 3) n'étant pas installable sous Android, l'utilisation reste restreinte, est sujette à l'installation potentiellement compliquée (et déroutante pour certains débutants en algorithmique et programmation).
Nouvel objectif donc: se passer de PIL
et faire en sorte que Libxy écrive de manière autonome ses graphiques sous forme d'image.
- Problème informatique 3: Quelle format d'image ?
Les formats d'image les plus utilisés, comme jpg et png, sont complexes et utilise des méthodes de compression évoluées; difficile donc à écrire sans l'utilisation d'une bibliothèque adéquate, ce que l'on cherche justement à éviter...
Le format ppm est un ancien format d'image, qui a l'avantage d'etre simple à manipuler: l'image est écrite dans un fichier texte, pixel après pixel.
La version Libxy-ppm génère des graphiques sous ce format.
Cette version peut intéresser des personnes souhaitant apprendre à écrire des images sous ce format.
Cette idée en est restée là car:
- Problème informatique 4: le format d'image ppm est en fait assez ancien et n'est plus pris en charge par défaut dans tous les environnements (Android par exemple, encore...).
Il faut se tourner vers un format que l'on peut écrire à la fois sans utilisation de bibiliothèque externe (surtout en langage c) mais assez répandu.
C'est le cas du format bmp (pour Bit Map, ou carte des bits).
Ce format contient un en-tete, donnant quelques caractéristiques de l'image (format taille, ...) puis comme le format ppm, les bits de l'image à la suite les uns des autres.
Il faut préciser que tout ce contenu est écrit dans un fichier binaire, ce qui provoque le
- Problème informatique 5: écrire une image au format bmp, qui est un fichier binaire, dans lequel, après l'en-tête,
les pixels de l'image sont écrits les uns à la suite des autres, au format RGB, octet par octet (en 256 couleurs, 1 octet pour le rouge (Red), 1 pour le vert (Green) et 1 pour le bleu (Blue)).
Merci pour cette étape à un bout du code présent
dans ce plus grand bout de code.
Pour la facilité et souplesse d'utilisation, il est courant d'utiliser le nom usuel des couleurs, plutôt que leur code RGB,
par exemple "red" pour (255,0,0), …
les couleurs courantes, utilisées notamment en css/html et Latex, sont listées là.
- Problèmes mathématiques:
en laissant de coté PIL/Pillow, il faut aussi écrire vraiment les fonctions graphiques désirées,
c'est-à-dire en décrivant touts les objets géométriques pixel par pixel
- en commençant par les points (en prenant en compte une éventuelle épaisseur)
- les lignes, alignement de pixels entre deux points
- …
et le plus dur jusque là: le coloriage, ou remplissage d'un polygone,
(option fill
).
Il faut pour cela être capable de déterminer si un point est à l'intérieur d'un polgone, étant donné ses sommets.
Voir par exemple: cette page
et cette discussion,
ou encore, en se restreignant à des polygones convexes (ce qui n'est bien sûr pas le cas dans Libxy).
La méthode et l'algorithme utilisés sont expliqués et détaillés
sur cette page.
De même, pour le coloriage/remplissage d'un disque, qui est plus aisé car un disque est un ensemble géométrique convexe simple,
dont on connaît bien l'expression analytique.
- Problème informatique 6: l'écriture des fichiers binaires diffère nettement entre python 2 et python 3.
En particulier le codage des caractères est différent (c'est un des plus grands changements entre python 2 et 3).
L'utilisation de la méthode chr() qui retourne le code ascii d'un entier (inférieur à 255) ne fonctionne plus similairement avec python 3.
Voir par exemple
cette page
La solution à ce problème, après de maintes recherches et tentatives peut se trouver là, dans l'encodage des caractères:
cf.
ces discussions
et après
quelques éléments sur le codage en python 3, particulièrement la méthode bytes:
à cette page.
Retour sur la page de Libxy
Première étape donc, écrire une bibliothèque graphique utilisable sous Android (les autres environnements découleront certainement alors...). La bibliothèque PIL (Python Imaging Library) est disponible nativemen avec qpython sous Android (qpython pas qpython3, pour laquelle la bibliothèque s'apelle maintenant Pillow mais n'est pas disponible). Cela amène la version Libxy(Pil) jusqu'à 1.3, reposant sur PIL et fontionnelle donc dès que PIL (ou Pillow) l'est.
- changement du système de coordonnées: cf. ces détails, en javascript dans un
canvas
, mais les opérations sont mathématiques donc largement indépendantes du seul langage de programmation. Dans une image les coordonnées d'un point sont mesurées en pixels, depuis, en général, le coin haut gauche qui est l'origine (0;0). Ce repère n'est pas toujours pertinent…
Nouvel objectif donc: se passer de PIL et faire en sorte que Libxy écrive de manière autonome ses graphiques sous forme d'image.
Merci pour cette étape à un bout du code présent dans ce plus grand bout de code.
Pour la facilité et souplesse d'utilisation, il est courant d'utiliser le nom usuel des couleurs, plutôt que leur code RGB, par exemple "red" pour (255,0,0), … les couleurs courantes, utilisées notamment en css/html et Latex, sont listées là.
- en commençant par les points (en prenant en compte une éventuelle épaisseur)
- les lignes, alignement de pixels entre deux points
- …
fill
).
Il faut pour cela être capable de déterminer si un point est à l'intérieur d'un polgone, étant donné ses sommets.
Voir par exemple: cette page et cette discussion, ou encore, en se restreignant à des polygones convexes (ce qui n'est bien sûr pas le cas dans Libxy).
La méthode et l'algorithme utilisés sont expliqués et détaillés sur cette page.
De même, pour le coloriage/remplissage d'un disque, qui est plus aisé car un disque est un ensemble géométrique convexe simple, dont on connaît bien l'expression analytique.
L'utilisation de la méthode chr() qui retourne le code ascii d'un entier (inférieur à 255) ne fonctionne plus similairement avec python 3.
Voir par exemple cette page
La solution à ce problème, après de maintes recherches et tentatives peut se trouver là, dans l'encodage des caractères: cf. ces discussions et après quelques éléments sur le codage en python 3, particulièrement la méthode bytes: à cette page.