libimage: les listes de points
dernière mise à jour: 15 octobre 2013
L'origine de ce concept se perd dans la nuit des temps, probablement
aux alentours de 1998... Je n'ai pas le moindre souvenir de pourquoi j'ai
commencé à imaginer ça. Mais il y a déja un peu de code écrit, autant
que ça serve à quelque chose. Commençons par les concepts de base.
Un point et une liste de points, c'est quoi ?
Comme un point se réfère à une image, il va forcément avoir les
coordonnées d'un pixel, donc un tuple x,y. Ensuite, nous avons
deux attributs: le premier est assimilable à la "hauteur" de
ce point dans le champ virtuel du monde pixelisé, et le second
est laissé à l'imagination du codeur (pourquoi pas un index dans une
LUT de couleurs ?) qui veut utiliser le kluge.
Pour des raisons historiques d'occupation mémoire, toutes ces coordonnées sont
stockées sur 16 bits. Désolé.
typedef struct
{
short x, y; /* pixel position */
short h; /* pixel value */
short c; /* color index ? */
} Image_Point;
Ensuite, pour manipuler des ensembles de points, nous les regrouperons dans
des listes de, justement, points. A priori, le descripteur d'une liste de
points n'est pas une structure publique, du moins, tant qu'elle n'est
pas à peu près figée.
Fonctions de bases
- Image_PtList * Image_ptl_alloc(int nbre, char *name);
- Allocation d'une liste de points. nbre étant le nombre
de points initialement alloués et name un texte arbitraire
d'une taille limitée. La taille est dynamique, c'est à dire qu'une liste
de points peut grossir à la demande.
- int Image_ptl_kill(Image_PtList *ptl, char *msg);
- Destruction d'une liste et probable récupération de la mémoire
utilisée. Si NULL != msg, un message est éventuellement
affiché sur stderr.
- int Image_ptl_get_size(Image_PtList *ptl, int *nbre, int *alloc);
- Récupère le nombre de points effectif dans la liste, et la place
disponible actuelle. On peut passer NULL si on ne veut pas
récupérer une des valeurs.
- int Image_ptl_add(Image_PtList *ptl, int x, int y, int h, int c);
- Ajout d'un point à une liste, en augmentant éventuellement la
taille de celle-ci, la taille de la liste étant limité par la mémoire
disponible, au bon vouloir du OOMK farceur. Il n'est
actuellement pas possible d'enlever un point de la liste.
- int Image_ptl_get(Image_PtList *ptl, Image_Point *pt, int idx);
- Lecture d'un point depuis une liste. Coredumpe peut-être,
mais pas trop souvent.
- int Image_ptl_boundingbox(Image_PtList *ptl, Image_Rect *box);
- Calcul de la boite qui englobe en x/y tous les points d'une liste.
Il traine probablement une off-by-one erreur dans le code.
Utilisez Image_dump_rect pour afficher
le résultat.
On peut, bien entendu, mettre ces listes de points dans des
fichiers.
haut de page