Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Resolu] Soucis de coordonnées  (Lu 1442 fois)

0 Membres et 1 Invité sur ce sujet

Septimium

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
[Resolu] Soucis de coordonnées
« le: Mars 14, 2014, 06:45:50 pm »
Bonjour à tous,

Alors voilà, je suis en train de migrer mon projet d'allegro à la sfml, cependant je rencontre un léger soucis lors du traçage d'un trait.

En gros, le trait que je trace représente simplement un laser tiré par un vaisseau, qui se déplace donc rectilignement à partir du point de départ, et ce, selon un angle défini.

Les deux paramètres principaux de de laser sont:
-Ses coordonnées
-Son angle

Voici le bout de code permettant de tracer ce laser à l’écran:

sf::RectangleShape laser(sf::Vector2f(taille, 2));
//laser.setOrigin(test, test2);
laser.setRotation(70);
laser.setPosition(coordonnees_x, coordonnees_y);
laser.setFillColor(Color(150, 150, 150, 255));
window.draw(laser);
 

Dans cet exemple, je test pour un angle de 70 degrés, et la variable taille représente la longueur du laser, ce qui n'est pas très important dans mon problème.

Les coordonnées x et y sont calculées ailleurs, dans le bout de code suivant:
coordonnees.x_det += cos(70 / 180 * 3.14159) * temps;
coordonnees.y_det += sin(70 / 180 * 3.14159) * temps;

La variable temps représentant le temps écoulé depuis le départ du projectile afin de connaitre sa position actuelle sur la trajectoire rectiligne qu'il suit.
Ici j'ai également forcé l'angle à 70 degrés pour les besoins du test, j'aurais pu le mettre directement en radian, mais peu importe.

J'en vient donc au problème, il semble que les coordonnées calculées ne suivent pas tout à fait l'angle de 70°, j'ai pensé que cela pouvait venir du fait que l'origine du laser est celle par défaut (0,0), et que donc je devais passer par un setOrigin() avant d'appliquer les coordonnées calculées, mais cela ne change rien, quelque soient les paramètres que j'applique à setOrigin().

Je suis quasiment certain que mon calcul de coordonnées est exact, étant donné que je l'utilise également pour le déplacement des vaisseaux et il fonctionne parfaitement.

Comme je suis loin d'être clair, j'ai joins une image présentant mon problème, on y voit le même laser à quelques secondes d'intervalle, on voit bien qu'il ne se déplace pas de manière linéaire, mais "de coté".

Je suppose que le problème vient de quelque part lorsque je "set" les coordonnées du laser, soit j'oublie de faire quelque chose, soit je ne le fait pas dans le bon ordre, mais là je "sèche" quelques peu . . .

A noter qu'il n'y à aucun problème lorsque l'angle est un multiple de PI/2 (45°, 90°, 135°, 180° . . .)

Merci de votre aide !
« Modifié: Mars 14, 2014, 07:54:35 pm par Septimium »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Soucis de coordonnées
« Réponse #1 le: Mars 14, 2014, 06:59:11 pm »
Tu as essayé ça ?

laser.setOrigin(taille / 2, 1);
Laurent Gomila - SFML developer

Septimium

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re : Soucis de coordonnées
« Réponse #2 le: Mars 14, 2014, 07:54:11 pm »
Merci de ta proposition, malheureusement oui, j'avais effectivement essayé ça.


A vrai dire, après des heures de recherches infructueuses, je vient de résoudre le problème.

Au moment ou je transforme les coordonnées du laser en coordonnées relative à l'écran afin de l'afficher, la conversion de la coordonnée 'y' était mal faite.

En gros, sur un écran 16/9, si je définissait un angle de 45°, en partant du centre de l’écran j'arrivait pile dans l'angle en bas a droite, ce qui était impossible vu que ce n'était pas un écran carré.

Voilà ce qui m'a permi de résoudre le problème.

Voici le calcul qui était faux si ça peut aider quelqu'un un jour:

Calcul du X (qui était correct):
coordonnees_x = ((coordonnees_x / niveau_zoom) * width) + width / 2;

Calcul du Y (sans correction):
coordonnees_y = ((coordonnees_y / niveau_zoom) * height) + height / 2;

Calcul du Y (avec correction):
coordonnees_y = ((coordonnees_y / niveau_zoom) * width) + height / 2;

Bon, je doute que ça aide quelqu'un vu que ce problème était quand même vachement ciblé, mais on ne sait jamais, merci de votre aide et bonne soirée.