Calcul trigonométrique avec des coordonnés

Résolu
Joseph_Hocquet Messages postés 17 Statut Membre -  
Joseph_Hocquet Messages postés 17 Statut Membre -
Bonjour,
Je souhaite faire apparaitre un cube vue de face avec une perspective en point de fuite et pouvoir changer les coordonnés de ce point de fuite. Pour cela, j'utilise les calculs trigonométriques pour définir :
1) l'angle

2) Les coordonnés du point partant du coin de la face de mon cube, en direction du point de fuite

Sur le papier, je n'ai pas l'impression qu'il y ai une erreur mais quand je le transpose sur python, les vecteurs ne vont pas du tout en direction du point de fuite...
Merci d'avance et j’espère avoir été assez claire.

6 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Sur le papier OK

    Maintenant, il faudrait voir le code Python pour contrôler la façon dont c'est implémenté ...

    L'indentation étant importante en Python, merci de copier/coller ici ton code complet avec les balises de code
    mode d'emploi:
    https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

    def test():
        print('test')
    
    test()
    
    0
  2. Joseph_Hocquet Messages postés 17 Statut Membre
     
    Merci d'avoir répondu aussi vite !
    Je suis vraiment désolé... En retravaillant mon code pour le rendre plus lisible, j'ai remarqué que j'avais interverti 2 variables... J'ai réessayé et ça marche à merveille. Ça fait 2 mois que je bloquais dessus. Excuse-moi pour t'avoir fait perdre ton temps.
    Voici le code pour ceux qui veulent aussi représenter un cube.
    x et y sont les coordonnés du point du quel vous voulez faire partir votre vecteur.
    La liste fuite contient les coordonnés du point de fuite.
    def carre() :
        x=random.randint(0,1280)
        y=random.randint(0,657)
        point=[]
        point.append(x+(cos(atan((fuite[1]-y)/(fuite[0]-x))))*30) # le "*30" c'est la longueur de mon vecteur
        point.append(y+(sin(atan((fuite[1]-y)/(fuite[0]-x))))*30)
        canv.create_line(x,y,point[0],point[1])
    from tkinter import *
    from math import*
    import random
    fen=Tk()
    fen.geometry("1280x657")
    canv=Canvas(fen)
    canv.place(x=0,y=0,height=657,width=1280)
    fuite=[300,100]
    canv.create_rectangle(295,95,305,105)
    carre()
    fen.mainloop()
    0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Bizarre ton truc : ca affiche juste un petit rectangle et une petite ligne un peu plus loin ...



    En plus pour ne pas répéter 1280 et 857 partout, je ferais ça:
    from tkinter import *
    from math import*
    import random
    
    def carre() :
    
        x1,y1=random.randint(0,WIDTH), random.randint(0,HEIGHT)
    
        x2 = (x1+(cos(atan((fuite[1]-y1)/(fuite[0]-x1))))*lvec)
        y2 = (y1+(sin(atan((fuite[1]-y1)/(fuite[0]-x1))))*lvec)
        canv.create_line(x1,y1,x2,y2)
    
    fuite=[300,100]
    WIDTH, HEIGHT = 1280, 657
    lvec = 30
    
    fen=Tk()
    fen.geometry(str(WIDTH)+"x"+str(HEIGHT))
    canv=Canvas(fen)
    canv.place(x=0,y=0,height=HEIGHT,width=WIDTH)
    
    canv.create_rectangle(295,95,305,105)
    carre()
    
    fen.mainloop()
    0
  4. Joseph_Hocquet Messages postés 17 Statut Membre
     
    Bonjour, oui Le programme c'était pour vérifier mes calculs donc le carré c'est juste un moyen de situer le point de fuite et la ligne part d'un coin de la face de mon cube que je n'ai pas affiché. Ces jours-ci j'ai peu avancé mais voila mon programme. j'ai juste des réglages à faire afin qu'en reliant les vecteurs on obtienne un carré et que la longueur de mon vecteur diminue si la distance entre le point de fuite et le coin du carré est inférieur à 30. Pour le programme il suffit de cliquer où on veut pour faire apparaitre un cube avec encore quelques soucis.
    def souris(aaa) :
        carre(aaa.x,aaa.y)
    def carre(x,y) :
        canv.create_rectangle(x-20,y-20,x+20,y+20,fill="blue", outline="white")
        point=[]
        for a in (20,-20) :
            for z in (20,-20) :
                if fuite[0]<x+a :
                    e=-1
                else:
                    e=1
                point.append(x+a+(cos(atan((fuite[1]-y-z)/(fuite[0]-x-a)))*e)*30)
                point.append(y+z+(sin(atan((fuite[1]-y-z)/(fuite[0]-x-a)))*e)*30)
        if fuite[1]<y-20 :
            canv.create_polygon(x-20,y-20,x+20,y-20,point[2],point[3],point[6],point[7],outline="white")
        if fuite[1]>y+20 :
            canv.create_polygon(x-20,y+20,x+20,y+20,point[0],point[1],point[4],point[5],outline="white")
        if fuite[0]<x-20 :
            canv.create_polygon(x-20,y-20,x-20,y+20,point[4],point[5],point[6],point[7],outline="white")
        if fuite[0]>x+20 :
            canv.create_polygon(x+20,y-20,x+20,y+20,point[0],point[1],point[2],point[3],outline="white")
    from tkinter import *
    from math import*
    import random
    fen=Tk()
    fen.geometry("1280x657")
    canv=Canvas(fen)
    canv.place(x=0,y=0,height=657,width=1280)
    fuite=[600,250]
    canv.create_rectangle(fuite[0]-5,fuite[1]-5,fuite[0]+5,fuite[1]+5)
    fen.bind("<ButtonPress-1>",souris)
    fen.mainloop()
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    ok, mais en principe, on met les imports, puis les fonctions, puis le programme principal,
    et on aère un peu :

    from tkinter import *
    from math import*
    import random
    
    def souris(aaa) :
        carre(aaa.x,aaa.y)
    
    def carre(x,y) :
        canv.create_rectangle(x-20,y-20,x+20,y+20,fill="blue", outline="white")
        point=[]
        for a in (20,-20) :
            for z in (20,-20) :
                if fuite[0]<x+a :
                    e=-1
                else:
                    e=1
                point.append(x+a+(cos(atan((fuite[1]-y-z)/(fuite[0]-x-a)))*e)*30)
                point.append(y+z+(sin(atan((fuite[1]-y-z)/(fuite[0]-x-a)))*e)*30)
        if fuite[1]<y-20 :
            canv.create_polygon(x-20,y-20,x+20,y-20,point[2],point[3],point[6],point[7],outline="white")
        if fuite[1]>y+20 :
            canv.create_polygon(x-20,y+20,x+20,y+20,point[0],point[1],point[4],point[5],outline="white")
        if fuite[0]<x-20 :
            canv.create_polygon(x-20,y-20,x-20,y+20,point[4],point[5],point[6],point[7],outline="white")
        if fuite[0]>x+20 :
            canv.create_polygon(x+20,y-20,x+20,y+20,point[0],point[1],point[2],point[3],outline="white")
    
    WIDTH, HEIGHT = 1280, 657
    fuite=[600,250]
    
    fen=Tk()
    fen.geometry(str(WIDTH)+"x"+str(HEIGHT))
    fen.bind("<ButtonPress-1>",souris)
    
    canv=Canvas(fen)
    canv.place(x=0,y=0,height=HEIGHT,width=WIDTH)
    
    canv.create_rectangle(fuite[0]-5,fuite[1]-5,fuite[0]+5,fuite[1]+5)
    
    fen.mainloop()
    
    0
  7. Joseph_Hocquet Messages postés 17 Statut Membre
     
    Merci ! C'est vrai que je ne présente jamais mes programme à d'autres personnes donc je ne savais pas comment faire la présentation. Pour l'instant, j'arrive à afficher correctement un cube seulement en bas à droite du point de fuite. J'essaye donc d'adapter mon programme pour le faire dans toute les configurations.
    Merci encore pour ton aide.
    0