<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>libimage: les listes de points</title> <link rel="stylesheet" type="text/css" href="libimage.css"> <meta name="generator" content="Vim et huile de phalange"> <meta name="keywords" content="libimage, Boudet, liste de points"> </head> <body> <h1>libimage: les listes de points</h1> <p align=center> <tt>dernière mise à jour: 15 octobre 2013</tt><br> </p> <p>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. </p> <h2>Un point et une liste de points, c'est quoi ?</h2> <p> Comme un point se réfère à une image, il va forcément avoir les coordonnées d'un pixel, donc un tuple <tt>x,y</tt>. 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 <small>LUT</small> 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é. </p> <pre class=code> typedef struct { short x, y; /* pixel position */ short h; /* pixel value */ short c; /* color index ? */ } Image_Point; </pre> <p> 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. </p> <h2>Fonctions de bases</h2> <dl class="proto"> <dt>Image_PtList * Image_ptl_alloc(int nbre, char *name); <dd>Allocation d'une liste de points. <tt>nbre</tt> étant le nombre de points initialement alloués et <tt>name</tt> un texte arbitraire d'une taille limitée. La taille est dynamique, c'est à dire qu'une liste de points peut grossir à la demande. <dt>int Image_ptl_kill(Image_PtList *ptl, char *msg); <dd>Destruction d'une liste et probable récupération de la mémoire utilisée. Si <tt>NULL != msg</tt>, un message est éventuellement affiché sur stderr. <dt>int Image_ptl_get_size(Image_PtList *ptl, int *nbre, int *alloc); <dd>Récupère le nombre de points effectif dans la liste, et la place disponible actuelle. On peut passer <tt>NULL</tt> si on ne veut pas récupérer une des valeurs. <dt>int Image_ptl_add(Image_PtList *ptl, int x, int y, int h, int c); <dd>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 <small>OOMK</small> farceur. Il n'est actuellement pas possible d'enlever un point de la liste. <dt>int Image_ptl_get(Image_PtList *ptl, Image_Point *pt, int idx); <dd>Lecture d'un point depuis une liste. Coredumpe peut-être, mais pas trop souvent. <dt>int Image_ptl_boundingbox(Image_PtList *ptl, Image_Rect *box); <dd>Calcul de la boite qui englobe en x/y tous les points d'une liste. Il traine probablement une <i>off-by-one</i> erreur dans le code. Utilisez <a href="libimage.html#tools">Image_dump_rect</a> pour afficher le résultat. </dl> <p> On peut, bien entendu, mettre ces listes de points dans des <a href="img-fichiers.html#ptl">fichiers</a>. </p> <p class="HDP"><a href="#top">haut de page</a></p> </body> </html>