Bonjours, dans mon code je modifie la valeur de plusieurs points pour qu'ils tournent en rond autour du centre d'un rectangle, je modifie leurs valeurs avec le même calcul et au même moment mais pourtant ils semblent ne pas se déplacer tous à la même vitesse et je ne vois pas d'où viens le problème.
Ce qui serait bien, c'est d'avoir un code réduit, mais compilable, qu'on puisse faire tourner pour voir l'erreur se produire.
Faudrait aussi utiliser un tableau de structures plutot que 10 variables, et des boucles plutôt que du copier coller, où il y a toujours un risque. Et donner des noms de types/variables qui ont un sens.
- Edité par michelbillaud 19 novembre 2023 à 8:33:15
J'aurais bien aimer envoyer une vidéo pour mieux montrer comment les points se déplace mais je crois pas que l'on puisse envoyer de vidéo sur le site.
J'enverrais peut être une partie du code plus tard mais faut d'abord que je recrée le problème dans un autre fichier, je pense que sa sera plus simple que de devoir chercher de partout dans mon code quel endroit est nécessaire ou pas, sa devrais pas me prendre trop de temps.
Voici un code qui déplace 10 points un peut près de la même manière, ce qui change c'est juste que au lieu de tourner autour d'un rectangle sa tourne autour du centre de la fenêtre.
non il n'y a pas de point[-1], mais lors de la première boucle sa va directement m'augmenter numPoint de 1 donc sa va me mettre numPoint à 0, enfin je crois.
pourtant j'ai regarder sur internet et le calcul ma l'air bon, je sais pas pourquoi sa ne marche pas.
Sinon si quelqu'un sait comment tourner une hitbox rectangle autour de son centre je veux bien que l'on me le dise car si j'essayais de faire tourner des points c'est justement car j'arrive pas à faire tourner un rectangle.
Les calculs se font avec la position courante et avec les arrondis (il y a beaucoup d'entier) la position se décale et s’amplifie à chaque calcul.
Je n'utilise pas SDL, mais sous Windows pour effectuer la rotation d'un dessin (rectangle ou autre) en fait on fait pivoter les axes x, y et on dessine normalement. (fonction de rotation d'axes : SetWorldTransform). Je suppose qu'il existe quelque chose de semblable sur SDL ?
Avec SDL il y a bien une fonction pour faire tourner des textures nommé SDL_RenderCopyEx mais je ne crois pas qu'il existe de fonction qui permet de tourner des rectangles ou autre.
oui je sais que la bibliothèque SDL2_GFX existe mais j'ai déjà essayer de l'installer et j'y arrive pas, dans les fichiers du seul site sur le quel j'ai réussi à y installer, qui est normalement le site officiel, ils n'y avais pas de fichier .dll, se qui, je crois, est nécessaire pour inclure une bibliothèque dans codeBlock, en tous cas je sais pas comment faire sans le .dll.
J'ai regardé les lignes 31 et 32, tout me paraît correct à part que la formule est adaptée pour un repère avec y pointant vers le haut. Donc au lieu de calculer une rotation de 1°, ça va calculer une rotation de -1°.
Conseil : fait afficher les valeurs de x, y sur 3 rotations. Puis calcule-les à la calculatrice, à partir de l'algorithme (pas du programme), sur un bout de papier. Et compare. Ça permettra de savoir une fois pour toutes si le problème vient des calculs ou d'autres chose.
Jusqu'à il y a environ 24h, il n'y a qu'une discussion : pourquoi les points ne tournent pas comme prévu ? Ma réponse suit celle de MorgadPrudhon il y a 24 heures, qui a revérifié la formule du calcul de rotation (elle semble OK), et la réponse de rouIoude qui craint un problème d'arrondi. Je l'encourage à comparer avec des calculs à la main pour vérifier ces deux points.
Ensuite on est passé à un deuxième sujet (donc hors-sujet) : comment faire directement avec les fonctions de la SDL. Il me semble qu'il vaut mieux ouvrir une nouvelle discussion pour en parler.
Sinon si quelqu'un sait comment tourner une hitbox rectangle autour de son centre je veux bien que l'on me le dise car si j'essayais de faire tourner des points c'est justement car j'arrive pas à faire tourner un rectangle.
Oui, c'est ici que MorgadPrudhon a lancé un nouveau sujet dans cette même discussion, du coup on ne sait pas si le sujet d'origine est résolu (ou s'il est abandonné).
Sinon si quelqu'un sait comment tourner une hitbox rectangle autour de son centre je veux bien que l'on me le dise car si j'essayais de faire tourner des points c'est justement car j'arrive pas à faire tourner un rectangle.
C'est pas trop évident le rapport entre faire tourner 10 points (*) et un rectangle qui a 4 coins.
(*) enfin 11, avec point[-1]
- Edité par michelbillaud 21 novembre 2023 à 12:58:36
Enfaite le rapport entre faire tourner des points et faire tourner un rectangle c'est que d'abord j'essaye de faire tourner une ligne de points puis une fois que j'aurais réussi sa, j'essayerais de faire tourner des points positionnés en forme de rectangle.
Si j'essaye de faire sa c'est car je n'arrive pas à faire tourner un rectangle juste avec SDL2 et je n'arrive pas à installer SDL2_GFX, qui est une bibliothèque relier à SDL2 et qui me permettrais de faire tourner un rectangle, car les fichiers ne contiennent que des .h et .cpp (et autres comme des .html) mais pas de .dll et .a.
Sinon je viens de faire le calcul de la valeur x de point[1], sa première position est x : 322 et y : 10 et en ayant fait le calcul à l'aide de l'algorithme dans mon code, j'obtiens, si on arrondit à l'unité, 322. Après j'ai utilisé la calculatrice de windows, pour avoir un résultat sûr, il faudrait attendre que je retrouve ma vraie calculatrice.
edit : Je viens de refaire le calcul avec une bonne calculatrice que j'ai trouvé en ligne et j'obtiens toujours (en arrondissant à l'unité) x : 322, alors que dans mon code j'obtiens x : 326.
- Edité par MorgadPrudhon 21 novembre 2023 à 15:00:12
Donc 1ère rotation = (322, ?) d'après programme, (326, ?) d'après calculatrice. Et par rapport à l'affichage, c'est compatible ? Tu t'attendais à quelles coordonnées ?
pour la position y je me suis dis que sa ne servais pas à grand chose de la calculer vu que rien que la position x a un problème par rapport à se que sa me met comme valeur à l'écran mais voilà la valeur y arrondi à l'unité : 10 et à l'écran y : 10.
Après je me suis peut être trompé dans mes calcul car si j'ai bon, alors le point n'avancerais jamais, à la limite si le point pourrais contenir des nombres à virgule le point avancerais juste très lentement mais comme le point ne peut contenir que des entiers, alors le point resterais figer si le programme obtiendrais le même résultat que moi.
C'est fastidieux vos calculs d'un point car son problème est l’alignement de plusieurs point à des distances différentes du centre de rotation (à ce que j'ai cru comprendre). Pour comprendre il faut exécuter le code de son troisième post.
Pour résoudre un problème le mieux c'est de décomposer.
Cette histoire de rotation, c'est pas bien clair. On va supposer qu'il s'agit de calculer l'image d'un point par une rotation d'un certain angle autour d'un centre.
Si c'est le cas, ça serait bien d'avoir une fonction comme ça :
/**
* retourne l'image d'un point par une rotation
*
* @param point les coordonnées du point
* @param center les coordonnées du centre de la rotation
* @param angle l'angle de la rotation en radians
*/
struct Point {
int x, y;
};
struct Point apply_rotation(struct Point point,
struct Point center,
double angle)
{
int dx = point.x - center.x;
int dy = point.y - center.y;
double c = cos(angle);
double s = sin(angle);
return (struct Point) {
.x = center.x + c*dx - s*dy,
.y = center.y + s*dx + c*dy
};
}
à partir de là, on peut regarder ce que donnent les calculs sur un exemple
int main()
{
struct Point center = { 600, 800 };
struct Point before = {.x = 322, .y = 10};
int degrees = 1;
double angle = degrees * M_PI / 180.0;
struct Point after = apply_rotation(before, center, angle);
printf("après rotation x =%d, y=%d\n", after.x, after.y);
return EXIT_SUCCESS;
}
on suppose ici que la fenêtre est de taille 800 x 600 (je ne sais pas comment vos calculatrices font pour deviner...)
$ gcc prog.c -lm
$ ./a.out
après rotation x =335, y=5
Avec ça il n,'est plus question de "points qui veulent pas se déplacer à la même vitesse à cause de la SDL", mais de codage correct en C des formules de rotation, avec les problèmes de précision, de troncature etc.
- Edité par michelbillaud 21 novembre 2023 à 16:04:37
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent