60) 08/02/2018 : L’aspect logiciel du graphisme géométrique (MJD 58157)

Dans la salle informatique S4, le ronron des ordinateurs atteste sereinement de la concentration des divers ingénieurs logiciels les yeux rivés sur leurs écrans. L’informatique est une esclavagiste impitoyable. Par moment, en tant que chef nous sommes obligés de leur imposer de prendre leurs temps de pause. Ils sont tellement passionnés de ce qu’il font qu’ils en oublient parfois d’aller manger quand la petite sirène sonne le rappel au réfectoire. Dans le coin à revues deux de nos esclaves sont en pleine discussion.
– Jour Tassin, jour Ferrando. Bigre, c’est quoi ça, vous avez dévalisé un musée ?
– Non chef, on retourne à l’école. Ce sont les manuels de trigo de Féfer.
– À bon, vous n’avez pas eu le BAC ni l’un ni l’autre ?
– Et vous chef, on peut le voir votre diplôme ? En fait on révise un peu les équadifs, car on doit faire tracer des ronds et des gradus, alors révisons un peu quelques Maths, on va en avoir besoin.

Un petit fifrelin de Théorie géométrico mathématique.

Pléonasme « un Petit fifrelin », qui traduit assez bien le fait que l’on ne va pas trop se prendre la tête. Nous allons à peine survoler un ou deux détails pour comprendre les séquences qui sur l’écran tracent des traits inclinés. Les bibliothèques … c’est génial ! Mais elles ne peuvent jamais se substituer totalement à un travail d’analyse. Tracer un cercle avec la bibliothèque de l’afficheur OLED est enfantin, tracer un segment également. Alors pourquoi diable se prendre la tête avec de la trigonométrie ? Pour frimer ? (Comme faire valoir à une soirée mondaine ou lors d’un discours politique … évitez, le sujet n’est pas porteur !)
La réponse à cette question tient en deux questions :
– Comment tracer les graduations de la rose des caps ?
– Comment tracer l’aiguille analogique qui tourne autour d’un axe de rotation virtuel ?
Pour les graduations, il serait possible de s’en tirer en imprimant une grille de 128 x 46 carrés. Puis on tracerait le cercle qui sur la Fig.315 est repéré 4. On ajouterait un cercle plus petit correspondant à l’extrémité centrale des graduations. On crayonnerait pour tracer les douze petits traits. Feutre de couleur en main chaque petit carré sous ces trait serait colorié, ainsi seraient représentés tous les pixels représentant les graduations. Fastoche, en plus ça ne prend que trois jours. Puis, on repérerait les coordonnées de l’origine et de l’extrémité de chaque graduation et la procédure display.drawLine()
se chargerait du reste. C’est une solution. Pas très élégante, vorace en temps pour tracer le modèle et inutilement coûteuse en octets de programme. De toute façon le problème de l’aiguille analogique qui tourne n’est pas résolu. Pour sortir de cette impasse … vive la trigo même si pas trop n’en faut !
Que ce soit pour tracer des graduations qui convergent vers un centre virtuel ou représenter une aiguille qui tourne, et dont l’extrémité se déplace sur un cercle, dans les deux cas on « tourne en rond ». Traduisez : Il faut calculer la position d’un point situé sur un cercle. Pour vous en convaincre, observez la Fig.322 sur laquelle le cercle extérieur de la rose des vents est située en 1. Toutes les graduations convergent vers le centre de ce cercle. Leurs extrémités sont situées sur le cercle 2. (Je vous l’avais bien dit que l’on allait faire des ronds !) Observons aussi l’aiguille qui tourne autour du pivot virtuel centré en A. Comme sa longueur est constante, son extrémité B se trouve forcément sur un cercle ayant pour rayon la distance AB. Pour tracer un segment tel que celui en vert, il suffit aussi de déterminer la position de ces ses extrémités C et D. Mis à part pour A qui se trouve au centre de la figure, tous les autres points sont situés dans des « vecteurs rayons » d’inclinaison connue et dont l’extrémité est située sur un cercle.

Et rond, et rond petit patarond.

Tracer un cercle point par point dans une matrice cartésienne consiste à déterminer la position de chaque élément dans un repère orthogonal centré dans la zone concernée. Pour simplifier les études, nous avons tout bénéfice à centrer le repère sur le centre des cercles 1, 2 et 3. On aboutit à la Fig.323 qui inclut les ingrédients indispensables à la cuisine mathématique qui va suivre. La saveur de notre recette réside dans des entités bien connues nommés SINUS et COSINUS qu’il faut faire mijoter à feux doux. Pour les coordonnées du point A c’est facile, deux fois zéro puisque le centre du repère YoX est placé précisément au centre du cercle 1. Nous savons que le point B se trouve sur un cercle de centre A et de rayon R égal à AB. Par définition des entités trigonométriques, nous avons la position horizontale
H = R Cosinus (α) = R Cosinus (AB). De façon analogue, la position verticale V = R Sinus (α) = R Sinus (AB). Donc, pour tracer l’aiguille en fonction de l’orientation de la sonde il suffira de déterminer la valeur de α en fonction du Cap Magnétique et de calculer V et H avec les formules trigonométriques. Nous avons bien de la chance, car l’IDE d’Arduino a bien écouté ses Professeurs quand il étudiait pour passer son BAC. Il connait parfaitement sa trigonométrie et met à notre disposition les fonctions sin(Alpha) et cos(Alpha). C’est génial de simplicité, il suffit d’utiliser ces fonctions pour nos formules.
– Génial, génial, pas tant génial que ça Totoche.
– Ben pourquoi Dudule, t’es encore en train de râler ?
– Parce que l’angle Alpha il est toxique !
– Ha bon pourquoi ça ?
– Ben parce qu’il doit être exprimé en Radians, pas en Degrés !
lups, faut immédiatement en informer le Ministre des angles. Bon, pas de quoi se rouler dans la poussière de colère. Il suffit de savoir que 360° correspondent à 2 x π Radians. Et π c’est ce nombre transcendantal qui fait environ 3,141592654 et des broutilles. En langage C il n’est donc pas bien compliqué de convertir un angle exprimé en degrés en son équivalent exprimé en radians. Une simple proportionnalité entre 360° et 6.2831852 encore que le compilateur du langage C d’Arduino manipule la constante PI sous forme d’un float. Et pour ceux à qui multiplier PI par deux et comparer avec du 360 donne des migraines, il y a en plus une fonction radians(Angle) qui retourne en Radians la valeur du paramètre Angle exprimé en degrés. L’est pas belle la vie arduinotique ?

Tracer l’aiguille analogique.

Grâce aux formules de la trigonométrie, vous aller voir que finalement animer un rayon vecteur virtuel devient un jeu d’enfant. Pour le prouver, nous allons analyser la séquence qui dans le logiciel du pupitre est chargée de faire bouger cette aiguille virtuelle et voir que la procédure se résume à pas grand chose. Dans cette séquence X et Y sont les coordonnées de l’extrémité du segment de droite à tracer et qui représente l’aiguille. Angle est la variable de type int qui contiendra la valeur du Cap actuel exprimée en degrés. Alpha de type float est l’identificateur du cap magnétique exprimé en radians. SAVX et SAVY préservent les anciennes valeurs de X et Y pour effacer. Cette séquence se trouve intégrée dans la boucle de base et explorée à chaque passage dans void loop().

La séquence qui fait tourner l’aiguille virtuelle ne sera prise en compte que si en (1) le booléen signale que l’option affichage des données de navigation en continu est validé. Puis, si le mode graphique n’est pas actif, les données seront affichées en mode numérique. Si en (2) le booléen vaut true, alors la séquence sera déroulée. En (3) le programme attend de recevoir un message sur RX. À ce stade du programme, l’Esclave envoie la valeur du Cap Magnétique. La chaîne de caractères est convertie en un entier et logée dans Angle. En (4) l’angle est converti en radians dans Alpha. Les variables X et Y contiennent les coordonnées du rayon vecteur tracé dans la boucle précédente. Avant de les recalculer pour l’orientation actuelle, on les sauvegarde temporairement dans SAVX et SAVY en ligne (5). En ligne (6) on calcule nos formules qui sont directement issues des études qui précèdent. La constante 15 représente la longueur de l’aiguille exprimée en pixels. Sur X on ajoute 32 et sur Y on ajoute 40. Ce sont les décalages du centre sur la matrice en latéral et en vertical. Le signe moins pour Y vient du fait que les coordonnées de la matrice OLED sont orientées positivement du haut vers le bas. Pour effacer l’aiguille on commence par la retracer en luminosité BLACK. L’origine du trait est 32,40 puisque ce sont les coordonnées du centre de la rose des vents dans la mosaïque graphique. L’extrémité est l’ancienne position préservée dans SAVX et SAVY. La ligne (8) efface l’ancien tracé. Comme il ne se superpose jamais sur les graduations, ces dernières ne sont affichées qu’une seule fois quand on valide le mode graphique. Moins il y a de pixels à changer, plus rapide sera le rafraîchissement de l’écran. Enfin en (9) on trace l’aiguille dans sa nouvelle position. Si la sonde ne change pas de Cap, on aura l’impression d’une immobilité.

Tracer les douze graduations de la rose des caps.

Désirant un affichage en temps réel, c’est à dire quasi instantané, il importe d’avoir le minimum de tracés à effectuer dans chaque passage de la boucle de base. C’est la raison pour laquelle tout ce qui reste constant ne sera affiché qu’une seule fois à l’ouverture du mode. Ensuite on se contente de ne rafraîchir que ce qui est réputé pouvoir changer au cours du temps. Sur la Fig.324 ce qui sera effacé et réécrit à chaque boucle est mis en évidence en noir alors que ce qui n’est affiché qu’à l’ouverture du mode graphique est représenté en gris clair. En minimisant ainsi le nombre de pixels à modifier sur la matrice on aboutit à une cadence de rafraîchissement tout à fait acceptable. Dans cette ligne de conduite la séquence qui trace les douze graduations n’est pas incluse à la boucle de base, et placée en procédure d’initialisation.
À regarder le listage de la séquence du tracé des graduations angulaires, on peut se demander si nous n’avons pas oublié quelque chose tellement elle est concise. Autant dire qu’elle n’est pas coûteuse en octets. Par ailleurs, plus une séquence est rudimentaire, plus elle sera déroulée rapidement.
En ligne (1) on commence par tracer le cercle extérieur. Dans ce but on utilise la procédure de la bibliothèque pour laquelle on donne les coordonnées du centre 32, 40. Puis le paramètre 23 indique le rayon en pixels. Enfin avec WHITE on précise que les pixels seront allumés. En (2) on génère la variable locale Angle et on va faire 360 / 30 = 12 fois ce qui suit le délimiteur ‘{‘. En (3) la variable globale Alpha reçoit exprimée en radians la valeur du compteur de boucle Angle. Il se trouve que Angle va prendre les valeurs de 0, 30, 60, 90 … 330 qui sont les inclinaisons souhaitées pour les graduations. En „ on calcule les coordonnées X et Y des extrémités centrales des graduations. Elles sont situées sur le cercle rose de la Fig.322 repéré 3. Ce cercle est centré en 32, 40 ce qui n’est pas nouveau. Le rayon de ce cercle fait 16 pixels. En (5) ce sont les coordonnées extérieures des tracés qui sont calculées. On réutilise ici les variables globales SAVX et SAVY. Le rayon du cercle extérieur est choisi à 23 pixels, soit identique au rayon du cercle extérieur. On n’a pas pris un pixel de moins, car avec les arrondis il se produisait quelques discontinuités nuisibles à l’esthétique. Enfin c’est la ligne (6) qui se charge de tracer en WHITE le segment de droite qui représentera la graduation. Avec cette analyse, nous allons clore le chapitre relatif au tout petit tableau de bord. Il est manifeste que parfois quelques rudiments de trigonométrie peuvent nous rendre de signalés services en programmation. Que vivent les sinus, les cosinus, les trucs mathématiques en nus …

La suite est ici.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *