jacquesvde a écrit:Es que ton topique pourrais éventuellement m’aider pour des questions de positionnement des équilles par exemple l’axes et la rotation comment repérer les coordonnée sur le plans de la gauge etc.
Bonjour Jacques
Je pense que pour ton cas précis du cluster Cessna, la librairie graphique ne te sera pas d'une grande utilité. Les lignes, cercles et polygones sont plutôt destinés à être dessinés à l'exécution pour le cas où on a des éléments susceptibles de varier, par exemple pour créer un indicateur de vitesse générique avec des arcs colorés de vitesse dépendants de paramètres tels que Vs, Vs0, Vne, Vno etc...
Dans ce cas, le programme Lua pourra dessiner des secteurs d'arc en fonction des vitesses spécifiées au début du code.
Autre utilisation possible, le dessin du plan de vol sur le ND par exemple, pour autant qu'on arrive à convertir des coordonnées Lat/Lon en coordonnées x/y (je suis sur le coup...).
Dernière idée, afficher la trace de l'avion dans la moving map de la console instructeur pour vérifier si le circuit d'attente correspond à quelquechose...
Pour en revenir à ton cluster, je te conseille plutôt la chose suivante:
Comme tu as des photos de qualité aux dimensions correctes, utilises-les pour créer les fond de jauge, en particulier pour le logo CESSNA qui est dans une police quasi impossible à trouver. Ces fonds de jauge, y compris les graduations sont de toutes façons fixes.
Pour la position des aiguilles, si on regarde bien la composition des jauges, on s'aperçoit que l'aiguille (l'élément graphique aiguille) décrit à chaque fois un arc de cercle de la gauche vers la droite d'une soixantaine de degrés, ce qui correspond à sa réalisation physique (l'axe de l'aiguille est dissimulé par le cache).
Je comprends ton embarras pour déterminer la position initiale de l'aiguille et la formule pour la faire tourner, car la fonction img_rotate() fait tourner un objet graphique en prenant le milieu de son "rectangle englobant" comme centre.
Le rectangle englobant est constitué par les dimensions maximales de l'objet graphique, par exemple une aiguille de 100x5 pixels incluse au milieu d'un fond de 200x200 aura pour rectangle englobant un rectangle de 200x200, et le centre de celui-ci sera aux coordonnées 100,100
La solution dans ton cas:
1- Tu crées une aiguille dans une boîte englobante deux fois plus longue que la longueur vue, par exemple une image de 100x5 pixels pour une aiguille dont la taille réelle est de 50x5. Cette aiguille sera dessinée horizontalement pour plus de facilité, l'image sera transparente, et l'aiguille occupera seulement la partie droite de l'image, à partir du milieu du rectangle de 100x5. L'image enregistrée au format PNG aura donc pour dimension 100x5 pixels
2- Tu positionnes dans ta jauge l'image de ton aiguille avec img_add(), fonction qui utilise comme origine le coin supérieur gauche du rectangle englobant.
Admettons que veuilles la positionner dans ta jauge de telle manière que l'axe de l'aiguille soit à l'emplacement x=200,y=100 (pour rappel l'origine 0,0 des jauges est toujours en haut à gauche).
L'axe de ton aiguille (le milieu de ta boîte englobante) est à +50 pixels à droite(soit 100/2) et + 2.5 pixels en bas (soit 5/2) de l'origine 0,0 de ton image de 100x5 pixels.
Donc les coordonnées à entrer dans la fonction
img_add() seront:
(200-50) pour les X et (100-2.5) pour les Y. Ainsi ton aiguille sera exactement positionnée avec le départ de son axe (le milieu de la boîte englobante) à l'endroit désiré 200,100 et horizontalement.
3- Tu souhaites maintenant la faire tourner pour l'orienter sur la graduation la plus à gauche.
On dessine un cercle dont le centre est l'axe de ton aiguille et le rayon l'extrémité de chaque graduation. La graduation de gauche est située à environ 30° à gauche de la verticale, la graduation de droite est à environ 40° à droite de la verticale.
La fonction
img_rotate() prend comme origine de rotation l'axe vertical et le haut du cercle. La rotation se fait dans le sens des aiguilles d'une montre en prenant comme centre de rotation le centre de la boîte englobante, ce qui veut dire qu'une rotation de 90° fera tourner l'objet graphique vers la droite, une rotation de -90° fera tourner l'objet vers la gauche.
Dans le cas de notre aiguille, celle-ci a été dessinée à l'horizontale et pointe pour l'instant vers la droite. Pour la ramener à la verticale, on la ferait tourner de -90°, pour l'amener à gauche en butée, on la fait tourner de -30° de plus, soit un total de -120°(-90-30). L'angle à entrer dans img_rotate est donc ici de -120° pour amener l'aiguille en butée à gauche (Empty).
Pour envoyer l'aiguille en butée à droite, on la ramène d'abord à la verticale par une rotation anti-horaire(-90°), puis on la décale ce coup-ci de 40° vers la droite (+40), soit un total de -50° (-90+40).
Toutes les valeurs intermédiaires seront comprises entre -120° et -50°.
La beauté de l'astuce de l'aiguille double est que tu n'as aucun calcul compliqué à faire en déplacement et rotation, l'aiguille étant déjà positionnée en son centre, une simple rotation de l'angle désiré amènera ton aiguille directement au bon endroit.
Pour terminer ton code, il te suffit de faire varier la rotation de l'aiguille en fonction des valeurs récupérées de FSX, sachant que:
une valeur de 0-->rotation de -120°
une valeur de 100%--> rotation de -50°
Tu sais que la variation d'angle disponible pour l'aiguille est donc de 70 degrés (de -120 à -50), donc ta formule de rotation sera:
img_rotate(nom de l'objet graphique, -120+(70*valeur/100))
Lorsque valeur sera 0, on a bien un angle de -120+(70*0/100)=-120°, en butée à gauche.
Lorsque valeur sera 100, on a bien un angle de -120+(70*100/100)=-50°, butée à droite.
Voilà, j'ai fait une longue explication, mais dans le but de décomposer la solution et de te laisser créer toi même le code plutôt que de te donner une formule toute faite.
En espérant avoir répondu à ton attente, je te conseille en plus de faire un dessin pour visualiser tout ça!
Jacques