Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rotation d'une figure

    15 décembre 2016 à 17:10:23

    Bonjour

    Moi et mon binome réalisons un projet de fin de semestre, cependant nous rencontrons une difficulté pour réaliser une tache répondant au cahier des charges.

    Nous avons réussi a tracer un triangle isocèle, a le faire avancer et reculer en fonctions des commandes entrer par l'utilisateur, mais nous ne savons pas comment faire pour le faire pivoter en fonction d'un angle donner ?

    voici le code (le module upemtk est interne a notre fac, il permet a l'aide de fonctions simple de tracer une fenetre, dessiner un cercle, une ligne etc...)

    from upemtk import *
    from math import *
    import math
    import time
    
    
    def tortue(x,y,tag):		#Triangle a faire pivoter
    	ligne(x,y-2/3*sqrt(8)*taille/2,x+taille/2,y+1/3*sqrt(8)*taille/2,tag=tag)
    	ligne(x+taille/2,y+1/2*sqrt(7/2)*taille/2,x-taille/2,y+1/2*sqrt(7/2)*taille/2,tag=tag)
    	ligne(x-taille/2,y+1/3*sqrt(8)*taille/2,x,y-2/3*sqrt(8)*taille/2,tag=tag)
    	
    	
    def deplacer_tortue(x,y,n,commande,tag):	#Fonction permettant de deplacer le triangle
    	compteur=0
    	if commande=="av":
    		dy=-1
    		dx=0
    	elif commande=="re":
    		dy=1
    		dx=0
    	while compteur<n:
    		efface(tag)
    		x=x+dx
    		y=y+dy
    		tortue(x,y,tag)
    		compteur=compteur+1
    		mise_a_jour()
    		time.sleep(0.01)
    		detectbord=detection_bords(x,y,l_fenetre, h_fenetre)
    		if detectbord==True:
    				titre=texte((l_fenetre/2)-85, (h_fenetre/2)-20, "Hors-cadre", couleur='black')
    				mise_a_jour()
    				efface(tag)
    				time.sleep(2)
    				efface(titre)
    				n=0
    				mise_a_jour()
    				x=200
    				y=200
    				tortue(x,y,tag)
    	return x,y
    	
    
    def detection_bords(x,y,l_fenetre, h_fenetre): # Fonction de la detection des bords
    	if x > l_fenetre or x < 0:
    		return True
    	elif y < 0 or y > h_fenetre:
    		return True
    	else:
    		return False
    
    def rotate(origin, point, angle):		#Test
        qx=(x+x+taille/2+x-taille/2)/3 + math.cos(angle)*(posx-((x+x+taille/2+x-taille/2)/3))-(math.sin(angle)*(posy -((y+1/3*sqrt(8)*taille/2+y-2/3*sqrt(8)*taille/2+y+1/2*sqrt(7/2)*taille/2)/3)))
        qy=(y+1/3*sqrt(8)*taille/2+y-2/3*sqrt(8)*taille/2+y+1/2*sqrt(7/2)*taille/2)/3+math.sin(angle)*(posx-((x+x+taille/2+x-taille/2)/3))+math.cos(angle)*(posy-((y+1/3*sqrt(8)*taille/2+y-2/3*sqrt(8)*taille/2+y+1/2*sqrt(7/2)*taille/2)/3))
        return qx,qy
    
    
    tag='cr7'
    l_fenetre = 400
    h_fenetre = 400
    cree_fenetre(l_fenetre,h_fenetre)
    taille=10
    n=0
    y=200
    x=200
    tortue(200,200,tag)
    posx,posy=deplacer_tortue(200,200,0,"av",tag)
    origin=((posx+posx+taille/2+posx-taille/2)/3,(posy+1/3*sqrt(8)*taille/2+posy-2/3*sqrt(8)*taille/2+posy+1/2*sqrt(7/2)*taille/2)/3)
    point=(posx,posy)
    commande=input("Entrez une commande: ")
    while commande!="fi":
    	if commande=="av":
    		n=int(input("Entre une valeur: "))
    		print('Tortue avance de ',n)
    		posx,posy=deplacer_tortue(posx,posy,n,commande,tag)
    		print(posx,posy)
    		mise_a_jour()
    	if commande=="re":
    		n=int(input("Entre une valeur: "))
    		print('Tortue recule de ',n) 
    		posx,posy=deplacer_tortue(posx,posy,n,commande,tag)
    		print(posx,posy)
    		mise_a_jour()
    	if commande=="td":
    		angle=int(input("Entrez un angle: "))
    		print("Tortue tourne de",angle)
    		posx,posy=rotate(origin,point,angle)
    		tortue(posx,posy,tag)
    		print(posx,posy)
    		mise_a_jour()
    	commande=input("Entrez une commande: ")
    Merci de nous donnez quelque conseils, le but est de se rapprocher de la fonction <tt class="descclassname">turtle.setheading</tt><tt class="descname" />(to_angle)<big> du module turtle qui permet de faire exactement ce que l'on veux ici</big>

    -
    Edité par Superd1b. 15 décembre 2016 à 17:11:12

    • Partager sur Facebook
    • Partager sur Twitter
      16 décembre 2016 à 10:54:13

      Salut !

      Je n'ai pas lu ton code, mais pour faire faire une rotation à une figure de géométrie discrète il faut identifier son point de rotation et effectuer la translation de l'angle voulue à chaque point suivant le cercle de centre "point de rotation" et de rayon [point de rotation : point]. 

      Edit : Après réflexion c'est bien la translation qui (me) pose un problème :D

      -
      Edité par TheDeerHunter 16 décembre 2016 à 11:56:41

      • Partager sur Facebook
      • Partager sur Twitter
        23 décembre 2016 à 14:25:51

        Finalement j'ai reussi a faire tourner la figure tout seul.

        Désormais un nouveau probleme ce pose, celui de faire avancer la figure dans le sens de sa direction, en effet au par avant on ne modifiais que le y ce qui permettait de faire avancer ou reculer la figure, mais maintenant quand j'ai un angle de 60° par exemple comment faire pour modifier le dx et dy pour que la figure avance ou recule selon l'angle donné ?

        Merci pour vos futurs réponses

        • Partager sur Facebook
        • Partager sur Twitter

        Rotation d'une figure

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown