Bonjour à tous,
J'ai créé 2 lignes qui tournent et je voudrais savoir qd elles rentrent en collision. J'ai aucune idée sur le sujet tous vos conseils me seront utiles.
merci d'avance
Bonjour à tous,
J'ai créé 2 lignes qui tournent et je voudrais savoir qd elles rentrent en collision. J'ai aucune idée sur le sujet tous vos conseils me seront utiles.
merci d'avance
2 lignes qui tournent !?
Excuse je complete la description :
c'est en fait deux lignes qui pivotent par rapport a une de leur extrémité. vu qu'elles tourne a des vitesses différentes et n'ont pas la meme longuer elles vont se rentrer dedans au bout d'un moment. Je voudrais savoir si il y a une commande qui peut renseigner sur une eventuelle collision entre deux ligne ou entre deux objet.
merci d'avance
Si tu ne précises par la bibliothèque graphique utilisée, ce sera dur.
http://www.developpez.net/forums/vie...ight=collision ?
en fait c'est sous tkinter
c'est assez interressant mais ca ne fonctionne qu'avec des formes pleines type rond, carré...
Le probleme avec les collisions de lignes c une collision possible en tout point de cette ligne et donc le calcul par rapport au centre marche pas dans ce cas la.
je me sert de create_line pour l'afficher ensuite mais estce qu'il va falloir que je definisse l'équation des deux droites et verifier si elles ont des point commun?
ta de la chance, justement, c'est sur qoui, je refrechits ( pour faits un jeux ,100%Tkinter)
oui, il y aun moyen, de savoi, si l'element 1, va ou a toucher l'element 2
je vais te laisser chercher un peut, car sa ma prits +++++++++ de temps
aide
aide
regarde ta sorti de console,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 def da(): c.move(1,1,0) c.move(2,-1,0) a =c.bbox(1) b =c.bbox(2) print c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5) fen.after(50,da) from Tkinter import* fen =Tk() c=Canvas() c.grid() c.create_text(0,50,text="a") c.create_text(300,50,text="b") da() fen.mainloop()
pas mal ca doit pouvoir m'aider
je vous tiens au courant
si tu veutx, je peut te dailler le scripts, si ta du mal a comprendre
bon je suis toujours pas arrivé
je suis aller voir la definition du find_enclosed(x1,y1,x2,y2)
les coordonnées doivent definir un rectangle mais comment se construit il?
Que definisse les x et y?
et puis ca marche dans ton exemple vu que c'est une ligne droite mais le rectangle suivra t'il une ligne qui pivote par rapport a une des extremité?
rappellle,
dans un fenetres cavas, chaque elements, afficher, lui est affecter, un nureros, celonts l'orde entrees, dans le scripts
.find_enclosed(x1,y1,x2,y2) , oui c'est un rectangle
defini, la zonne, dans le cavas, ou il ya un elements, si no il sorte () si oui, il sorte (x,),
c'est comme un vise, qui de dit oui il y a queque chose, devants lui (x) un ou pluiseur chose (x,x,x,x,x,) image, text, carrer, rectangle, line...., ou no ()
il ya aussi .find_closest, lui, il indique, si il ya un elements a se point
dans mon exemple
j'utulise .bbox(1) pour connaitres les coodornne, instantanner de la lettres "a", le 1 est dornner par canvas, car l'ordres, que j'ai mit etaitsque sauve sur la variable dans a, qui me donne sous la forme d'une liste (10,20,3,25)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 c.create_text(0,50,text="a") c.create_text(300,50,text="b")
que j'envoits surle -5, que tu voits, on peut dire, que c'est la precition, de la dection du colison
Code : Sélectionner tout - Visualiser dans une fenêtre à part print c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5)
Il noust sorte du (1,), juste a la colision de "b", qui nous sorte (1,2,)
sa veut dire, que 1 et 2, sont ensemble 1="a" et 2="b"
oui, sa marche dans touts les mouvements les plus foux,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 def da(): c.move(1,1,0) #deplace le 1(la lettres a), de 1x et 0y c.move(2,-1,0) #depla le 2(b), de -1x,0y a =c.bbox(1) #recuper la taille et emplacement de 1(a) b =c.bbox(2) #idem, juste pour faire beaux #rechercher se qui contients, comment elements sur se retacque, qui et en mouvements, avec le 1(a), et affiche sa sorti print c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5) fen.after(50,da) #veut apres 50ms, retourne sur def da from Tkinter import* fen =Tk() c=Canvas() c.grid() c.create_text(0,50,text="a") #le nombre 1 luis et doner automatiquement c.create_text(300,50,text="b") #le nombre 2 " " " " " da() fen.mainloop()
comemnt, j'essai, de faire un boobman, avec cette methode
si no envoits moi ton code,
j'ai ajouter, les ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 def da(): c.move(1,1,0) c.move(2,-1,0) a =c.bbox(1) #dessinner le rectangle c.coords(3,a[0]-5,a[1]-5,a[2]+5,a[3]+5) d =c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5) print d if d!=(1,): print d,'toucher' fen.after(50,da) from Tkinter import* fen =Tk() c=Canvas() c.grid() c.create_text(0,50,text="a") #1 c.create_text(300,50,text="b") #2 c.create_rectangle(0,0,0,0) #3 da() fen.mainloop()
pour voir le rectangle desinner autour de la lettre a
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 c.create_rectangle(0,0,0,0) #3 c.coords(3,a[0]-5,a[1]-5,a[2]+5,a[3]+5)
alors ca marche pas dans mon cas de figure car le rectangle qui se forme est trop grand et ne colle pas au pivot que je veux.
il prend l'origine de mon pivot puis son extremité et effectue les projeté pour tracé le rectangle ce qui va pas du tout
Mon but est d'afficher un message dans une petit fenetre disant qu'il y a collision entre les deux pivots.
je te donne un version allégé de mon programme pour que tu comprenne comment ca marche.
Si tu connais la solution pour reperer la collision entre les deux merci d'avance de m'expliquer comment.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 from Tkinter import * from math import * import time, string import threading import sys def transfo_ang(angle_degre): angle_radian=angle_degre*pi/180 return angle_radian class MyPivot: def __init__(self, orgX, orgY, longueur, angleBut1, angleDeg, angleBut2, w, sens_rotation, epaisseur, couleur): #sens_rotation: taper trigo ou antitrigo self.orgX = orgX #w est exprimé en deg/s self.orgY = orgY #angleDeg, angleBut1, angleBut2 en degré (angleBut1<angleBut2) self.epaisseur = epaisseur self.couleur = couleur self.longueur = longueur self.angleDeg = angleDeg self.w = w angleRad = transfo_ang(self.angleDeg) self.angleBut1 = angleBut1 self.angleBut2 = angleBut2 self.extX=self.longueur*cos(angleRad)+orgX self.extY=-self.longueur*sin(angleRad)+orgY self.ligne=None self.sens_rotation=sens_rotation if sens_rotation == 'antitrigo': self.sens=-1 else : self.sens=1 def inverse_sens(self): if (self.angleBut1 != None) & (self.angleBut2 != None): if (self.angleDeg >= self.angleBut2): self.angleDeg=self.angleBut2 self.sens=-self.sens if (self.angleDeg <= self.angleBut1): self.angleDeg=self.angleBut1 self.sens=-self.sens def afficher(self, windowParent): windowParent.delete(self.ligne) self.ligne=windowParent.create_line(self.orgX,self.orgY,self.extX,self.extY, width=self.epaisseur, fill=self.couleur) def rotation(self, nouvelAngle): self.angleDeg = nouvelAngle self.inverse_sens() self.angleRad = transfo_ang(self.angleDeg) self.extX=self.longueur*cos(self.angleRad)+self.orgX self.extY=-self.longueur*sin(self.angleRad)+self.orgY class MyWindow(Canvas): def __init__(self, boss, longueur, largeur): Canvas.__init__(self, width = longueur, height = largeur) self.longueur = longueur self.largeur = largeur self.create_line(2,2,2,100, width=2, fill='black', arrow=LAST) self.create_line(2,2,100,2, width=2, fill='black', arrow=LAST) def move(): delta_t=500 #tps de rafraichissement exprimé en ms myPivot1.afficher(myWindow1) myPivot2.afficher(myWindow1) myPivot1.rotation(myPivot1.angleDeg + myPivot1.sens*(myPivot1.w*delta_t/1000)) myPivot2.rotation(myPivot2.angleDeg + myPivot2.sens*(myPivot2.w*delta_t/1000)) fen.after(delta_t, move) if __name__ == '__main__': fen =Tk() fen.title("deux pivots") myWindow1 = MyWindow(fen, 800, 600) myPivot1 = MyPivot(400, 300, 290, None, 130, None, 2, 'trigo', 3, 'yellow') myPivot2 = MyPivot(25, 25, 300, 280, 290, 350, 2, 'antitrigo', 3, 'green') move() myWindow1.pack(side=LEFT) fen.mainloop()
j'y travaille dessus,
a periorits, ma methode ne marche pas sur ton scripts ;(
en fait pour que cela puisse fonctionner correctement il faudrait pouvoir definir un poligone plutôt qu'un rectangle
si non tu peut utiliser .find_closest si tu range tes point dans un tableau avec une boucle sa devrait etre assé rapide a verifier
+
Je suis parti sur une autre méthode hier qui consiste a creer 4 droites pour encadrer un pivot et avec une condition qui analyse les coordonnées de l'extremité de l'autre pivot pour savoir si elle est dans la zone defini par les 4 droites.
Je fini de tester ca et je vous montrerai le code.
Si vous avez trouvé une autre solution un peu moins lourde je veux ien la regarder
ton scripts est beaux, et tres compliques, avec touts ces variables a rallonge,
pour def afficher,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 def afficher(self, windowParent): windowParent.delete(self.ligne) self.ligne=windowParent.create_line(self.orgX,self.orgY,self.extX,self.extY, width=self.epaisseur, fill=self.couleur)
utuliserpour redessiner la ligne, et ça le deplacer en même temps
Code : Sélectionner tout - Visualiser dans une fenêtre à part .coords()
si no, pour ma methodes (.find_....) ne marche pas tros dans ton cas
le nom de ta Cavans n'a pas le meme nom,
, il faudras, refaits le scripts, et plus allerger, et plus lineaires en retirrants les class
desoler je ne peuts pas tros d'aide ;(
Ok merci qd meme , j'ai reussi a effectuer la detection avec l'encadrement des pivots et ca marche tres bien meme si c'est un peu lourd et compliqué.
si tu veux le voir je te le posterai
autrement merci de tout l'interet que tu as porté a mon probleme.
@+
si t'as reusir , c'est bon signe
faist voir, le nouveux scpits
np
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager