Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL, points ne se déplacent pas à la même vitesse.

Sujet résolu
    19 novembre 2023 à 4:27:18

    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.

    valeur de départ des points : 

    struct2.point[0].x = struct3.rect2[0].x;
                struct2.point[0].y = 0;
                
                struct2.point[1].x = struct3.rect2[0].x;
                struct2.point[1].y = 0 + (struct3.personnage.h - 10);
                
                struct2.point[2].x = struct3.rect2[0].x;
                struct2.point[2].y = 0 + (struct3.personnage.h * 2 - 10);
                
                struct2.point[3].x = struct3.rect2[0].x;
                struct2.point[3].y = 0 + (struct3.personnage.h * 3 - 10);
                
                struct2.point[4].x = struct3.rect2[0].x;
                struct2.point[4].y = 0 + (struct3.personnage.h * 4 - 10);
                
                struct2.point[5].x = struct3.rect2[0].x;
                struct2.point[5].y = 0 + (struct3.personnage.h * 5 - 10);
                
                struct2.point[6].x = struct3.rect2[0].x;
                struct2.point[6].y = 0 + (struct3.personnage.h * 6 - 10);
                
                struct2.point[7].x = struct3.rect2[0].x;
                struct2.point[7].y = 0 + (struct3.personnage.h * 7 - 10);
                
                struct2.point[8].x = struct3.rect2[0].x;
                struct2.point[8].y = 0 + (struct3.personnage.h * 8 - 10);
                
                struct2.point[9].x = struct3.rect2[0].x;
                struct2.point[9].y = 0 + (struct3.personnage.h * 9 - 10);



    Ma fonction qui sert à déplacer le point :

    SDL_Point deplacementPoint(struct struct2 struct2, struct struct3 struct3, struct struct1 struct1)
    {
        struct1.pointX[struct1.numPoint] = struct2.point[struct1.numPoint].x;
        struct1.pointY[struct1.numPoint] = struct2.point[struct1.numPoint].y;
        
        struct2.point[struct1.numPoint].x = (struct1.pointX[struct1.numPoint] - (struct3.rect.x + struct3.rect.w / 2)) * cos(1.0 * (M_PI / 180.0)) - (struct1.pointY[struct1.numPoint] - (struct3.rect.y + struct3.rect.h / 2)) * sin(1.0 * (M_PI / 180.0)) + (struct3.rect.x + struct3.rect.w / 2);
        struct2.point[struct1.numPoint].y = (struct1.pointX[struct1.numPoint] - (struct3.rect.x + struct3.rect.w / 2)) * sin(1.0 * (M_PI / 180.0)) + (struct1.pointY[struct1.numPoint] - (struct3.rect.y + struct3.rect.h / 2)) * cos(1.0 * (M_PI / 180.0)) + (struct2.rect.y + struct3.rect.h / 2);
    
        return struct2.point[struct1.numPoint];
    }
    moment ou je fais appelle à ma fonction "deplacementPoint" dans "main" :
    struct1.numPoint = 0;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 1;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 2;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 3;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 4;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 5;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 6;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 7;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 8;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    
           struct1.numPoint = 9;
           struct2.point[struct1.numPoint] = deplacementPoint(struct2, struct3, struct1);
    Je pense que ces tous se dont il y a besoin, normalement je ne modifie pas la valeur des points à un autre endroit dans mon code.
    • Partager sur Facebook
    • Partager sur Twitter
      19 novembre 2023 à 8:31:07

      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

      • Partager sur Facebook
      • Partager sur Twitter
        19 novembre 2023 à 16:44:39

        position de départ des points :

        position des points après un tour complet :

        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.

        • Partager sur Facebook
        • Partager sur Twitter
          19 novembre 2023 à 17:02:29

          Pour tes calculs tu utilises une "constante" : cos(1.0 * (M_PI / 180.0)) cosinus de 1° idem pour sinus, ça doit tourner moyennement rond ?
          • Partager sur Facebook
          • Partager sur Twitter
          ...
            19 novembre 2023 à 18:54:21

            #include <exception>
            #include <string>
            #include <iostream>
            #include <SDL.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <math.h>
            
            int main(int argc, char* argv[])
            {
                SDL_Window *window;
                SDL_Renderer *renderer;
                SDL_Point point[10];
                SDL_bool quit = SDL_FALSE;
                SDL_Event event;
            
                int wWindow, hWindow;
                int pointX[10], pointY[10];
                int numPoint = -1;
                int ticks, TDeplacementPoint = 0;
            
                SDL_Init(SDL_INIT_VIDEO);
                window = SDL_CreateWindow("test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 645, 481, SDL_WINDOW_RESIZABLE);
                renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            
                SDL_GetWindowSize(window, &wWindow, &hWindow);
            
                point[0].x = wWindow/2;
                point[0].y = 0;
            
                point[1].x = wWindow/2;
                point[1].y = 10;
            
                point[2].x = wWindow/2;
                point[2].y = 20;
            
                point[3].x = wWindow/2;
                point[3].y = 30;
            
                point[4].x = wWindow/2;
                point[4].y = 40;
            
                point[5].x = wWindow/2;
                point[5].y = 50;
            
                point[6].x = wWindow/2;
                point[6].y = 60;
            
                point[7].x = wWindow/2;
                point[7].y = 70;
            
                point[8].x = wWindow/2;
                point[8].y = 80;
            
                point[9].x = wWindow/2;
                point[9].y = 90;
            
            
            
                while(!quit)
                {
            SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
            
                   SDL_RenderClear(renderer);
            
                   for(numPoint = -1 ; numPoint <= 9 ; numPoint++)
                   {
                       SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
                       SDL_RenderDrawPoint(renderer, point[numPoint].x, point[numPoint].y);
            
            
            
            
                   }
            
                   ticks = SDL_GetTicks();
            
                       if(TDeplacementPoint == 0)
                        TDeplacementPoint = SDL_GetTicks();
            
                        if(ticks >= TDeplacementPoint + 50)
                       {
                   for(numPoint = -1 ; numPoint <= 9 ; numPoint++)
                   {
            
                         pointX[numPoint] = point[numPoint].x;
                       pointY[numPoint] = point[numPoint].y;
            
                       point[numPoint].x = (pointX[numPoint] - wWindow / 2) * cos(1.0 * (M_PI / 180.0)) - (pointY[numPoint] - hWindow / 2) * sin(1.0 * (M_PI / 180.0)) + wWindow / 2;
                       point[numPoint].y = (pointX[numPoint] - wWindow / 2) * sin(1.0 * (M_PI / 180.0)) + (pointY[numPoint] - hWindow / 2) * cos(1.0 * (M_PI / 180.0)) + hWindow / 2;
            
                       TDeplacementPoint = 0;
                   }
                       }
            
                   SDL_RenderPresent(renderer);
            
                   while(SDL_PollEvent(&event))
                   {
                       if(event.type == SDL_QUIT)
                       {
                           quit = SDL_TRUE;
                       }
                   }
                }
            }

            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.

            • Partager sur Facebook
            • Partager sur Twitter
              19 novembre 2023 à 19:38:28

              for (int i = 0; i < 10; i++) {
                  point[i].x = wWindow/2;
                  point[i].y = 10 * i;
              }
              

              Et là dedans

               for(numPoint = -1 ; numPoint <= 9 ; numPoint++)
                     {
                         // ...
                         SDL_RenderDrawPoint(renderer, point[numPoint].x, point[numPoint].y);
               

              point[-1], ça existe ?



              -
              Edité par michelbillaud 19 novembre 2023 à 19:40:30

              • Partager sur Facebook
              • Partager sur Twitter
                19 novembre 2023 à 19:46:17

                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.
                • Partager sur Facebook
                • Partager sur Twitter
                  19 novembre 2023 à 19:48:50

                  Ah bon. Faut pas croire, faut constater.

                  1) a ton avis que fait ce programme ?
                  2) fais le tourner pour voir

                  #include <stdio.h>
                  
                  int main() {
                  	for (int numPoint = -1; numPoint <= 9; numPoint++) {
                  		printf("Je m'occupe de point[%d]\n", numPoint);
                  	}
                  	return 0;
                  }
                  



                  -
                  Edité par michelbillaud 19 novembre 2023 à 19:54:36

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 novembre 2023 à 19:54:59

                    ok je viens de vérifier et enfaite je me suis tromper, je vais changer sa mais je suis pas sur que sa règle mon problème.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 novembre 2023 à 19:56:06

                      Tu supposes 

                      • qu'il n'y a qu'un seul problème ?
                      • que les problèmes sont seulement dans la partie du code que tu montres ?

                      -
                      Edité par michelbillaud 19 novembre 2023 à 19:57:06

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 novembre 2023 à 20:00:02

                        je viens de modifier les -1 en 0 et sa ne règle toujours pas le problème.

                        Je ne sais pas si il n'y a qu'un seul problème, tous se que je sais c'est que mes points ne se déplace pas comme prévu et je ne sais pas pourquoi.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 novembre 2023 à 0:40:38

                          Après avoir nettoyé ton programme et l'avoir simplifié

                          #include <math.h>
                          #include <SDL2/SDL.h>
                          
                          #define DELAY_TO_DISPLAY	50
                          
                          int main(int argc, char *argv[]) {
                          	(void)argc;
                          	(void)argv;
                          	
                          	SDL_Window *window;
                          	SDL_Renderer *renderer;
                          	SDL_Point point[10];
                          	SDL_bool quit = SDL_FALSE;
                          
                          	const int wWindow=645, hWindow=481;
                          
                          	SDL_Init(SDL_INIT_VIDEO);
                          	window = SDL_CreateWindow("test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, wWindow, hWindow, SDL_WINDOW_RESIZABLE);
                          	renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
                          
                          	for(int i=0; i<10; i++) {
                          		point[i].x = wWindow/2;
                          		point[i].y = i*10;
                          	}
                          	
                          	Uint32 tick_compute_position=SDL_GetTicks()+DELAY_TO_DISPLAY;
                          	while(!quit) {
                          		if(SDL_GetTicks()>=tick_compute_position) {
                          			for(int numPoint=0; numPoint<10; numPoint++) {
                          				int tmp=point[numPoint].x;
                          				point[numPoint].x = (point[numPoint].x - wWindow / 2) * cos(M_PI / 180.0) - (point[numPoint].y - hWindow / 2) * sin(M_PI / 180.0) + wWindow / 2;
                          				point[numPoint].y = (tmp - wWindow / 2) * sin(M_PI / 180.0) + (point[numPoint].y - hWindow / 2) * cos(M_PI / 180.0) + hWindow / 2;
                          			}
                          			tick_compute_position=SDL_GetTicks()+DELAY_TO_DISPLAY;
                          		}
                          		SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
                          		SDL_RenderClear(renderer);
                          		SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
                          		SDL_RenderDrawPoints(renderer, point, 10);
                          		SDL_RenderPresent(renderer);
                          		SDL_Event event;
                          		while(SDL_PollEvent(&event))
                          			if(event.type==SDL_QUIT) {
                          				quit = SDL_TRUE;
                          				break;
                          			}
                          	}
                          	
                          	return(0);
                          }

                          les points s'affichent, mais pas au bon endroit. Ce sont donc les lignes 31 et 32 qui posent problème.

                          Edit: 255 --> SDL_ALPHA_OPAQUE

                          -
                          Edité par edgarjacobs 20 novembre 2023 à 3:01:25

                          • Partager sur Facebook
                          • Partager sur Twitter

                          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                            20 novembre 2023 à 12:16:55

                            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.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 novembre 2023 à 14:09:34

                              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 ? 

                              • Partager sur Facebook
                              • Partager sur Twitter
                              ...
                                20 novembre 2023 à 14:22:29

                                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.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 novembre 2023 à 23:46:34

                                  Avec sld v1, il y avait la librairie SDL_GFX qui permettait de faire la rotation d'un quadrilatère. Peut-être existe-t-elle pour sdl v2 ? A vérifier.

                                  Edit: vérification faite, la réponse est oui.

                                  -
                                  Edité par edgarjacobs 21 novembre 2023 à 1:58:54

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                    21 novembre 2023 à 10:14:05

                                    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.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      21 novembre 2023 à 10:57:01

                                      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.

                                      -
                                      Edité par robun 21 novembre 2023 à 10:58:05

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        21 novembre 2023 à 11:32:40

                                        Euh, on s'occupe de quel problème ?

                                        • les points qui ne se déplacent pas comme attendu ?
                                        • la rotation d'une texture  ?
                                        • la rotation d'un quadrilatère ?
                                        • l'installation de SDL2_GFX ?
                                        • l'installation de SDL 2 tout  court ?
                                        Y a quand même une tendance à sauter d'une question à l'autre, avec pour effet de n'en résoudre aucune.

                                        -
                                        Edité par michelbillaud 21 novembre 2023 à 11:35:07

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          21 novembre 2023 à 11:45:24

                                          Oui, ça commence à devenir un peu confus...

                                          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.

                                          -
                                          Edité par robun 21 novembre 2023 à 11:48:23

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            21 novembre 2023 à 12:09:37

                                            MorgadPrudhon a écrit:

                                            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.



                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            ...
                                              21 novembre 2023 à 12:35:27

                                              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é).

                                              -
                                              Edité par robun 21 novembre 2023 à 12:36:14

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                21 novembre 2023 à 12:54:19

                                                rouIoude a écrit:

                                                MorgadPrudhon a écrit:

                                                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

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  21 novembre 2023 à 14:14:05

                                                  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

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    21 novembre 2023 à 15:04:15

                                                    Bonne idée de rester sur point[1]. 

                                                    Position initiale = (322, 10)

                                                    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 ?

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      21 novembre 2023 à 15:33:45

                                                      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.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        21 novembre 2023 à 15:46:08

                                                        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. 

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        ...
                                                          21 novembre 2023 à 15:57:29

                                                          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

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            21 novembre 2023 à 16:46:16

                                                            rouIoude : j'avais vérifié la formule de la rotation à partir du code d'edgarjacobs.

                                                            -
                                                            Edité par robun 21 novembre 2023 à 16:49:09

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              21 novembre 2023 à 17:18:06

                                                              robun a écrit:

                                                              rouIoude : j'avais vérifié la formule de la rotation à partir du code d'edgarjacobs.

                                                              C'est le même en simplifié.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              ...

                                                              SDL, points ne se déplacent pas à la même vitesse.

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              • Editeur
                                                              • Markdown