Mais l'image map, ce n'est pas du tag HTML classique? Les tags SVG <circle/>, <rect/> et <polygon/> ont donc directement un pendant <area/>...
SVG possède le système de Pattern pour les textures.
De ce que j'ai vu, Inkscape n'a pas d'API directe pour la conversion PNG→SVG, il faudra creuser un peu plus la ligne de commandes.
Pour le lissage, j'avais eu ce genre d'opération à faire sur un stage de 2e année.
Comme algo, j'ai itéré sur les sommets. Pour chaque sommet (P0), je teste si les deux suivants (P1, P2) sont alignés (à peu près) avec P0. Si oui, je supprime le sommet inutile (P1), sinon, je passe au sommet suivant (P1), et je recommence.
Une solution bien plus propre mathématiquement reviendrait à utiliser la méthode des moindres carrés (pour nous, la variante régression linéaire).
On part d'un point P0, on considère les 2 points qui le suivent (P1,P2), et on cherche la droite qui passe "au plus près" de ces points {P0,P1,P2}. On peut forcer la droite à passer par P0 et P2 (les extrémités) pour éviter les effets colatéraux. Cette droite est définie par la régression (pour {P0,P1,P2}, il n'existera qu'une et une seule droite de régression, parfaitement calculable). Une fois la droite trouvée, on calcule son coefficient de corrélation, et tant qu'il est inférieur à un seuil donné, on ajoute le point suivant (P3) à la liste des points lissés, et on recommence. Dès que ce coefficient est trop grand, on vire le dernier point ajouté, et on ne garde que les extrémités de la dernière droite.
Si le coefficient de régression est trop grand dès le début (pour {P0,P1,P2}), alors {P0,P1,P2} ne sont pas alignés, et on ne vire aucun point; on passe directement à P1 et on recommence le calcul.
Pour éviter le cas particulier de fin ({P0,P1,P2} non alignés), on peut dire:
Après, la condition sur le coeff de régression peut être modifiée (coeff moyen plutôt qu'une somme? variance maximale, pour ne pas supprimer les points aberrants?).
En prêt à l'emploi, Simplify semble adapté.
SVG possède le système de Pattern pour les textures.
De ce que j'ai vu, Inkscape n'a pas d'API directe pour la conversion PNG→SVG, il faudra creuser un peu plus la ligne de commandes.
Pour le lissage, j'avais eu ce genre d'opération à faire sur un stage de 2e année.
Comme algo, j'ai itéré sur les sommets. Pour chaque sommet (P0), je teste si les deux suivants (P1, P2) sont alignés (à peu près) avec P0. Si oui, je supprime le sommet inutile (P1), sinon, je passe au sommet suivant (P1), et je recommence.
Code :
Une valeur de seuil → S
Point initial du path → P0
Tant qu'on n'a pas fait le tour du path {
Point suivant P0 → P1
Point suivant P1 → P2
Si [P0P1]^[P0P2] < S
Alors Supprimer P1
Sinon Garder P0; P1 → P0
}
Une solution bien plus propre mathématiquement reviendrait à utiliser la méthode des moindres carrés (pour nous, la variante régression linéaire).
On part d'un point P0, on considère les 2 points qui le suivent (P1,P2), et on cherche la droite qui passe "au plus près" de ces points {P0,P1,P2}. On peut forcer la droite à passer par P0 et P2 (les extrémités) pour éviter les effets colatéraux. Cette droite est définie par la régression (pour {P0,P1,P2}, il n'existera qu'une et une seule droite de régression, parfaitement calculable). Une fois la droite trouvée, on calcule son coefficient de corrélation, et tant qu'il est inférieur à un seuil donné, on ajoute le point suivant (P3) à la liste des points lissés, et on recommence. Dès que ce coefficient est trop grand, on vire le dernier point ajouté, et on ne garde que les extrémités de la dernière droite.
Si le coefficient de régression est trop grand dès le début (pour {P0,P1,P2}), alors {P0,P1,P2} ne sont pas alignés, et on ne vire aucun point; on passe directement à P1 et on recommence le calcul.
Pour éviter le cas particulier de fin ({P0,P1,P2} non alignés), on peut dire:
Code :
Coeff de regression max → R
Point initial → P0
Tant qu'on n'a pas fait le tour {
Liste de points vide → X[]
P0 → X[]
Faire {
Trouver la droite de régression de X[] → D
Calculer le coefficient de régression pour {D, X[]} → r
} Tant que r < R
Supprimer les points de X[], sauf le premier (P0) et le dernier (P1)
Dernier point de X[] (P1) → P0
}
En prêt à l'emploi, Simplify semble adapté.