Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rotation d'un triangle dans le plan avec Pygame

    23 juillet 2021 à 17:29:35

    Bonjour, j'ai besoin de transformer des triangles dans le plan alors que j'utilise Pygame.

    J'ai donc créé une classe Triangle2D comme suit:

    class Triangle2D:
        def __init__(self, p1, p2, p3):
            self.points = [p1, p2, p3]
            
        def translate(self, vector):
            for p in self.points:
                p[0] += vector[0]
                p[1] += vector[1]
            
            
        def get_centroid(self):
            cx = sum(p[0] for p in self.points) / len(self.points)
            cy = sum(p[1] for p in self.points) / len(self.points)
            return (cx, cy)
        
            
        def rotated(self, theta):
            #theta (float): Angle in radians
            rot_pts = []
            for p in self.points:
                x, y = p[0], p[1]
                cx, cy = self.get_centroid()
    
                x = (x - cx) * cos(theta) + (y - cy) * sin(theta) + cx
                y = (cx - x) * sin(theta) + (y - cy) * cos(theta) + cy
                rot_pts.append((x,y))
                
            return Triangle2D(*rot_pts)

    Le problème étant qu'au rendu, le triangle obtenu n'est pas simplement tourné, mais déformé.

    Je me doute que cela puisse venir du cumul d'incertitudes notamment lors des produits, mais n'y aurait-il pas une manière de régler cela ?

    rouge la position du triangle dans le plan, jaune le centre de masse (centroid), blanc le triangle initial, vert triangle tourné et déformé >_<

    Merci par avance ^^

    -
    Edité par lemonnTree 23 juillet 2021 à 17:30:53

    • Partager sur Facebook
    • Partager sur Twitter

    Status 418

      23 juillet 2021 à 17:48:06

      Quel rapport avec pygame ?
      • Partager sur Facebook
      • Partager sur Twitter

      "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

        23 juillet 2021 à 17:53:17

        Ah oui, j'étais en train de l'utiliser avec Pygame alors dans le feu de l'action j'ai mis Pygame dans le titre. Effectivement le problème se généralise, il y a juste un problème supplémentaire lors de l'utilisation des fonctions de gfxdraw de Pygame, puisqu'il faut des coordonnées entières.

        Pygame a été retiré du titre.

        • Partager sur Facebook
        • Partager sur Twitter

        Status 418

          23 juillet 2021 à 18:02:22

          Y a-t-il pas un moment où il faut utiliser atan2 ?
          • Partager sur Facebook
          • Partager sur Twitter

          "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

            23 juillet 2021 à 18:32:38

            Je vais peut-être dire une bêtise, mais ligne 25, ça devrait pas être y =(x - cx) * sin(theta) + (y - cy) * cos(theta) + cy ? pour garder le même sens que pour x

            Edit: j'ai dit une bétise (je le savais :p)

            par contre, tu calcules le nouveau y avec la nouvelle valeur de x, ce qui fausse le calcul de y

            -
            Edité par umfred 23 juillet 2021 à 18:40:55

            • Partager sur Facebook
            • Partager sur Twitter
              23 juillet 2021 à 21:53:29

              umfred a écrit:

              Je vais peut-être dire une bêtise, mais ligne 25, ça devrait pas être y =(x - cx) * sin(theta) + (y - cy) * cos(theta) + cy ? pour garder le même sens que pour x

              Edit: j'ai dit une bétise (je le savais :p)

              par contre, tu calcules le nouveau y avec la nouvelle valeur de x, ce qui fausse le calcul de y

              -
              Edité par umfred il y a environ 3 heures


              Hooooo bien vu!
              • Partager sur Facebook
              • Partager sur Twitter

              "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                25 juillet 2021 à 16:58:05

                umfred a écrit:

                Je vais peut-être dire une bêtise, mais ligne 25, ça devrait pas être y =(x - cx) * sin(theta) + (y - cy) * cos(theta) + cy ? pour garder le même sens que pour x

                Edit: j'ai dit une bétise (je le savais :p)

                par contre, tu calcules le nouveau y avec la nouvelle valeur de x, ce qui fausse le calcul de y

                -
                Edité par umfred 23 juillet 2021 à 18:40:55


                ohlala oui ! J'ai beau l'avoir lu et relu, je l'avais pas vu celle là, la boulette >_<. Merci ! ( ça marche nickel maintenant ^^)

                -
                Edité par lemonnTree 25 juillet 2021 à 16:58:36

                • Partager sur Facebook
                • Partager sur Twitter

                Status 418

                  26 juillet 2021 à 15:22:45

                  en faite, c'est ma bétise qui m'a fait pencher sur chercher les formules de rotation (pour vérifier), et bon j'ai aussi un peu de temps à voir le remplacement du y
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Rotation d'un triangle dans le plan avec Pygame

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