Calcul trigonométrique avec des coordonnés

Résolu/Fermé
Joseph_Hocquet Messages postés 17 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022 - 28 juil. 2021 à 11:22
Joseph_Hocquet Messages postés 17 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022 - 4 août 2021 à 13:31
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.
A voir également:

6 réponses

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 28 juil. 2021 à 12:07
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
Joseph_Hocquet Messages postés 17 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022
Modifié le 28 juil. 2021 à 16:52
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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 29 juil. 2021 à 16:58
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
Joseph_Hocquet Messages postés 17 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022
Modifié le 31 juil. 2021 à 18:26
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 31 juil. 2021 à 20:13
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
Joseph_Hocquet Messages postés 17 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022
4 août 2021 à 13:31
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