Comment faire tourner une spirale avec python ?

Comment faire tourner une spirale avec python ? - Python - Programmation

Marsh Posté le 07-07-2014 à 21:09:02    

Bonjour,
 
je travaille sur un projet de psychologie sur l'attention visuelle, et pour cela j'aurais besoin de faire s'afficher une spirale sur un des côtes de mon ecran.
Je n'ai jamais code auparavant, avec ce que j'ai trouve sur internet j'ai bricole le code ci-dessous. Il est tres lourd, je pense aue je pourrais remplacer les affichages successifs par des boucles au lieu de les ecrire mais je ne sais pas comment m'y prendre.
Le plus gros probleme, c'est que je voudrais que ma spirale tourne autour de son axe, alors que la, elle se decale a chaque rotation, et je ne comprends pas pourquoi.
 
Pourriez-vous m'aider s'il vous plaît ?
 
Merci par avance de votre aide et de votre indulgence...
 
 
    import pygame
    from pygame.locals import *
 
    # Definition des dimensions de la fenetre :
    W, H = 1280, 700
 
 
    # Definition de la couleur du fond, proche de celle du fond des photo pour limiter le contraste :
    bg_col = [130, 120, 100]
    window = pygame.display.set_mode([W,H])
 
 
    # Definition de plusieurs images de spirales, tournees de 5° :
 
    spirale0 = pygame.image.load('spirale.jpeg')
    spirale1 = pygame.transform.rotozoom(spirale0, 5, float(0.3))
    spirale2 = pygame.transform.rotozoom(spirale1, 5, float(1))
    spirale3 = pygame.transform.rotozoom(spirale2, 5, float(1))
    spirale4 = pygame.transform.rotozoom(spirale3, 5, float(1))
    spirale5 = pygame.transform.rotozoom(spirale4, 5, float(1))
    spirale6 = pygame.transform.rotozoom(spirale5, 5, float(1))
    spirale7 = pygame.transform.rotozoom(spirale6, 5, float(1))
    spirale8 = pygame.transform.rotozoom(spirale7, 5, float(1))
    spirale9 = pygame.transform.rotozoom(spirale8, 5, float(1))
    spirale10 = pygame.transform.rotozoom(spirale9, 5, float(1))
    spirale11 = pygame.transform.rotozoom(spirale10, 5, float(1))
    spirale12 = pygame.transform.rotozoom(spirale11, 5, float(1))
 
 
 # Affichage
 
    window.fill(bg_col)
    window.blit(spirale1, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale2, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale3, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale4, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale5, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale6, [200, 454])
    pygame.display.flip()
    pygame.time.wait(300)
 
    window.fill(bg_col)
    window.blit(spirale7, [200, 454])
   pygame.display.flip()
   pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale8, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale9, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale10, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale11, [200, 454])
    pygame.display.flip()
   pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale12, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
PS : j'utilise une image de spirale au lieu de la dessiner dans python car le but est de travailler sur l'attraction du regard en fonction des differents types de spirales.

Reply

Marsh Posté le 07-07-2014 à 21:09:02   

Reply

Marsh Posté le 07-07-2014 à 23:59:52    

ptit_stagiaire a écrit :

Bonjour,
 
je travaille sur un projet de psychologie sur l'attention visuelle, et pour cela j'aurais besoin de faire s'afficher une spirale sur un des côtes de mon ecran.
Je n'ai jamais code auparavant, avec ce que j'ai trouve sur internet j'ai bricole le code ci-dessous. Il est tres lourd, je pense aue je pourrais remplacer les affichages successifs par des boucles au lieu de les ecrire mais je ne sais pas comment m'y prendre.
Le plus gros probleme, c'est que je voudrais que ma spirale tourne autour de son axe, alors que la, elle se decale a chaque rotation, et je ne comprends pas pourquoi.
 
Pourriez-vous m'aider s'il vous plaît ?
 
Merci par avance de votre aide et de votre indulgence...
 
 
    import pygame
    from pygame.locals import *
 
    # Definition des dimensions de la fenetre :
    W, H = 1280, 700
 
 
    # Definition de la couleur du fond, proche de celle du fond des photo pour limiter le contraste :
    bg_col = [130, 120, 100]
    window = pygame.display.set_mode([W,H])
 
 
    # Definition de plusieurs images de spirales, tournees de 5° :
 
    spirale0 = pygame.image.load('spirale.jpeg')
    spirale1 = pygame.transform.rotozoom(spirale0, 5, float(0.3))
    spirale2 = pygame.transform.rotozoom(spirale1, 5, float(1))
    spirale3 = pygame.transform.rotozoom(spirale2, 5, float(1))
    spirale4 = pygame.transform.rotozoom(spirale3, 5, float(1))
    spirale5 = pygame.transform.rotozoom(spirale4, 5, float(1))
    spirale6 = pygame.transform.rotozoom(spirale5, 5, float(1))
    spirale7 = pygame.transform.rotozoom(spirale6, 5, float(1))
    spirale8 = pygame.transform.rotozoom(spirale7, 5, float(1))
    spirale9 = pygame.transform.rotozoom(spirale8, 5, float(1))
    spirale10 = pygame.transform.rotozoom(spirale9, 5, float(1))
    spirale11 = pygame.transform.rotozoom(spirale10, 5, float(1))
    spirale12 = pygame.transform.rotozoom(spirale11, 5, float(1))
 
 
 # Affichage
 
    window.fill(bg_col)
    window.blit(spirale1, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale2, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale3, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale4, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale5, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale6, [200, 454])
    pygame.display.flip()
    pygame.time.wait(300)
 
    window.fill(bg_col)
    window.blit(spirale7, [200, 454])
   pygame.display.flip()
   pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale8, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale9, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale10, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
    window.fill(bg_col)
    window.blit(spirale11, [200, 454])
    pygame.display.flip()
   pygame.time.wait(30)
 
    window.fill(bg_col)    
    window.blit(spirale12, [200, 454])
    pygame.display.flip()
    pygame.time.wait(30)
 
PS : j'utilise une image de spirale au lieu de la dessiner dans python car le but est de travailler sur l'attraction du regard en fonction des differents types de spirales.


 
 
Une façon pourrait être d'afficher un gif avec tkinter :

  • utiliser une image animée (gif) d'une spirale (http://i702.photobucket.com/albums [...] spiral.gif) ou créer soit même une série d'images successives
  • extraire les images du gif avec par exemple ce site : http://gif-explode.com/ et les sauvegarder sur le pc, ici sous les noms de 1.gif, 2.gif, etc. avec l'extension .gif pour résoudre une erreur (cf dernier point)
  • utiliser le code suivant (testé avec Python 2.7.6.1) et mettre dans imagelist le chemin vers les images extraites du gif :


Code :
  1. # http://www.daniweb.com/software-de [...] th-tkinter
  2. # mimic an animated GIF displaying a series of GIFs
  3. # an animated GIF was used to create the series of GIFs
  4. # with a common GIF animator utility
  5. import time
  6. from Tkinter import *
  7. root = Tk()
  8. imagelist = ["1.gif","2.gif","3.gif",
  9. "4.gif","5.gif","6.gif"]
  10. # extract width and height info
  11. photo = PhotoImage(file=imagelist[0])
  12. width = photo.width()
  13. height = photo.height()
  14. canvas = Canvas(width=width, height=height)
  15. canvas.pack()
  16. # create a list of image objects
  17. giflist = []
  18. for imagefile in imagelist:
  19.     photo = PhotoImage(file=imagefile)
  20.     giflist.append(photo)
  21. # loop through the gif image objects forever
  22. while True:
  23.     for gif in giflist:
  24.         canvas.delete(ALL)
  25.         canvas.create_image(width/2.0, height/2.0, image=gif)
  26.         canvas.update()
  27.         time.sleep(0.1)
  28. root.mainloop()


 


Python est un langage facile à appréhender, cela peut valoir le coût de lire un tutoriel sur ce langage.


Message édité par honrisse le 08-07-2014 à 00:07:16
Reply

Marsh Posté le 09-07-2014 à 15:29:47    

Merci beaucoup !
 
J'ai trouvé plus simple mais qui ne marcherait jamais pour des formes non symétriques, donc je garde précieusement votre réponse pour plus tard.
 
Si d'autres en ont besoin, voici ce que j'ai fait (et j'ai progressé, j'ai appris à faire une boucle depuis... oui je partais de loin...) :
 
    def spiral():
        spi_0 = pygame.image.load('spirale.png')
        for i in range(200) :
        spi_i = pygame.transform.rotozoom(spi_0, i*(-3), float(0.4))
        ws, hs = spi_i.get_size()
        window.fill(bg_col)
        window.blit(spi_i, [200 - ws/2, 450 -hs/2])
        pygame.display.flip()
        pygame.time.wait(10)
 
Le problème, c'était que ma spirale était définie par un carré, donc elle tournait au sein de ce carré, mais une fois pivoté, un carré n'occupe plus la même hauteur ni la même largeur, du coup ma spirale était déformée un peu à chaque tour. La solution, c'était de définir  "ws, hs = spi_i.get_size()" pour inclure hs et ws dans les dimensions d'affichage (window.blit(spi_i, [200 - ws/2, 450 -hs/2]) au lieu de window.blit(spirale2, [200, 450])).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed