Le canevas donné avec cet énoncé est le même que celui de la séance précédente. Il est toujours destiné à lire sur son flux d’entrée un texte html supposé contenir une et une seule table bien formée avec les attributs bgcolor et colspan pour la balise td. Chaque cellule a un contenu textuel supposé être un nombre entier en base 10, et de plus la somme des cellules d’une ligne est toujours égale à 100. Le but de l’application est de retourner sur le flux de sortie une traduction de cette table de valeurs numériques en un graphique SVG choisi parmi plusieurs grâce au premier argument fourni.
On souhaite représenter chaque ligne de la table par un cercle découpé en tranches partant du rayon. La couleur de chaque tranche sera celle de l’attribut bgcolor de la cellule considérée. La longueur de l’arc de cercle sera proportionnelle à la valeur numérique figurant dans la cellule. La valeur de l’attribut colspan sera ignorée dans cette question. Le rayon du cercle est égal à la constante HAUTEUR (définie dans le fichier .h fourni).
En SVG, un arc d’ellipse se dessine par la commande A de l’attribut d de la balise path. Cette commande a 7 arguments :
Trouver une traduction graphique en SVG de la table donnée en exemple, en utilisant des opérateurs trigonométriques.
Donner la définition de la fonction C camembert, construisant cette traduction pour toute table HTML donnée sur le flux d’entrée.
On revient à la représentation graphique en rectangles, mais on souhaite donner une impression de volume en dessinant au dessus de chaque rectangle un parallélogramme dont l’un des côtés est le sommet du rectangle, et sur le bord droit du rectangle un autre parallèlogramme ayant ce bord comme côté commun. Trouver la traduction en SVG de ces deux parallèlogrammes pour un des rectangles de la table. Utiliser la balise polygon possédant un attribut points semblable à la construction XDrawPolygon de X11.
Que se passe-t-il lorsque l’on souhaite dessiner ces effets de volumes sur tous les rectangles consécutifs d’une ligne de la table ? En déduire la fonction C cube dessinant les effets souhaités.
La balise linearGradient permet de définir des dégradés de couleur de la gauche vers la droite, cette direction pouvant être changée avec l’attribut gradientTransform admettant en valeur la commande rotate vue avec la balise g. La définition d’un gradient consiste en une suite de balises stop avec les attributs suivants :
Choisir un système de nommage approprié et réécrire la fonction précédente afin que les rectangles utilisent l’attribut fill=’url(#nom)’.
Ecrire la fonction InitDefs définissant, dans la portée de la balise defs, autant de dégradés que la table HTML contient de cellules.