J'annonce de part ce présent message, la réécriture de la bibliothèque de génération et de manipulation de formes libSDL2_gfxutils. Elle est publiée sous GPLv3.
Sommaire
- SDL2_gfxutils
SDL2_gfxutils
Résumé de la bibliothèque SDL2_gfxutils
- Version actuelle : 2.0.0
- Plateformes cibles : Linux, Windows et normalement tous les compatibles Posix (non testé)
- Compilateurs : gcc, g++, clang, mingw32, mingw-w64-686, mingw-w64-x86_64.
- Licence : GPLv3
- Auteur : Eddie Brüggemann (mrcyberfighter CHEZ gmail)
La petite histoire de SDL2_gfxutils
SDL2_gfxutils est issue d'une collection de fonctions de génération de formes implémentée pour des besoins personnels.
À chaque fois que j'avais une idée de forme dans la tête j'essayais de l'implémenter - pendant plusieurs années…
J'ai commencé par écrire des fonctions Python avec le module pygame qui est basé sur la bibliothèqe SDL, étant parti d'une fonction qui calcule la position d'un pixel selon un rayon et un angle.
SDL2_gfxutils a été écrit une première fois sous forme de bibliothèque C complémentaire à SDL2_gfx (dont les fonctions sont utilisées uniquement pour l'affichage) et je me suis sacrément trompé en tronquant les données vers le type requis par SDL2_gfx: int16_t
.
Mais SDL2_gfxutils a été entièrement réécrit et amélioré par la même occasion pour nous donner cette nouvelle implémentation, compatible C++.
La nouvelle implémentation de SDL2_gfxutils
Toutes les fonctions génératrices de formes retournent un pointeur sur un type spécifique SDL2_gfxutils (Polygon, Star, …) compatible avec le type générique Form
.
Les pointeurs permettent de manipuler les formes générées pour les transformer par rotation, translation, mise à l'échelle et effet miroir, facilement.
Les pointeurs peuvent bien sur être détruits à volonté et cette mécanique est utilisée massivement dans la génération de forme.
Le type générique Form
a changé pour contenir des coordonnées de type float
, à la place de int16_t
. Le calcul pour les rotations, translations, mise à l'échelle et effet miroir s'exécute correctement maintenant.
Avant les int16_t
étaient doublés en interne pour les calculs. D'ailleurs si le cœur vous en dit il suffit de remplacer chaque occurrence du mot float par le mot double dans les fichiers source pour opérer en double précision (cela se fait en 5 minutes avec un éditeur de texte).
Les membres du sous-type Pixel
sont de type float
maintenant.
- Certaines fonctions ont été enlevées, devenues inutiles avec la mécanique des pointeurs ;
- D'autres fonctions ont été ajoutées, pour remplacer les fonctionnalités perdues, avec beaucoup d'avantages, surtout pour l'animation dans la boucle principale d'affichage ;
- Toutes les fonctions ont été améliorées grâce à la mécanique des pointeurs de libSDL2_gfxutils.
Présentation de libSDL2_gfxutils.
SDL2_gfxutils est une extension de SDL2_gfx pour aider à la création et animation (d'images fantastiques que vous pouvez imaginer.) SDL2_gfxutils fournit diverses fonctions pour divers usages:
- Des fonctions de génération de formes : du simple polygone à travers les étoîles fantasques vers les fractals les plus complexes.
- Des fonctions de transformation et d'animation de haut niveau agissant sur le type générique
Form
. - Des fonctions de génération de lignes et d'arcs.
- Des fonctions de bas niveau de transformation et d'animation agissant sur un simple
Pixel
. - Des fonctions de gestion et de contrôle de la mémoire.
Il est facile d'adapter SDL2_gfxutils pour être compatible avec d'autres bibliothèques que SDL2_gfx. Il suffit de changer les fonctions d'affichages_.
Opérations de transformation de formes
-
Rotation d'une forme (
Form
) autour de son centre du nombre de degrés voulu ; - Mise à l'échelle d'une forme de part un facteur ou une valeur ;
-
Translation d'une forme (
Form
) des valeurs dex
et dey
voulues ; -
Effet miroir par un axe
X
ouY
selon un point central, soumis a condition (voir documentation).
Il vaut mieux passer des valeurs entières ou de faible précision sinon si l'on boucle cela risque de perturber libsdl2_gfxutil.
Changement de paramètres de formes: les setters
- Changer le centre de gravité de la forme (
Form
) avec translation optionnelle des coordonnées ; - Changer le rayon de la forme (
Form
) ce qui équivaut à une mise a l'échelle en mettant la valeur directement (sans passer par un facteur de mise à l'échelle) ; - Assigner une nouvelle couleur à une forme (
Form
) ou ligne (Line
).
Récupérer les paramètres d'une forme: les getters
- Récupérer le pixel (
Pixel
) central courant de la forme (Form
) ; - Récupérer la couleur (
Color
) de la forme (Form
) ; - Récupérer le rayon de la forme ;
- Récupérer l'orientation courante de la forme ;
- Récupérer le membre
real_length
de la forme (Form
) qui correspond au point le plus éloigné du centre (utilisable par exemple pour les collisions formes).
Il n'est pas toujours évident d'associer la notion de rayon à certaines formes.
Affichage des formes
Chaque type de forme (Form
) a ses propres fonctions d'affichage (sinon vous pouvez vous servir de celle que vous désirez mais le résultat sera indéfini et vous aurez des surprises.
Pour chaque fonction d'affichage il existe une version anti-crénelage et une version pour assigner l'épaisseur du trait, excepté pour l'affichage en plein.
Longueur et distance entre 2 pixels
- Mesurer la longueur d'une ligne (
Line
) - Récupérer le milieu d'une ligne (
Line
)
Enfin, cette extension à SDL2_gfx peut, de part sa structure, facilement être adaptée à d'autres bibliothèques que la SDL2.
Aller plus loin
- SDL2_gfxutils présentation (253 clics)
- SDL2_gfxutils github (103 clics)
- SDL2_gfxutils documentation (119 clics)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.