Bonjour à tous,

Le titre est assez explicite, je cherche à faire des rotations sur des triangles dans un Canvas.

J'ai réussi à trouver un algo qui me distingue de mes camarades, mais j'ai vraiment du mal à l'implementer dans mon code...

Ci joint l algo :
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
 
def getangle(event):
    dx = c.canvasx(event.x) - center[0]
    dy = c.canvasy(event.y) - center[1]
    try:
        return complex(dx, dy) / abs(complex(dx, dy))
    except ZeroDivisionError:
        return 0.0 # cannot determine angle
 
def press(event):
    # calculate angle at start point
    global start
    start = getangle(event)
 
def motion(event):
    # calculate current angle relative to initial angle
    global start
    angle = getangle(event) / start
    offset = complex(center[0], center[1])
    newxy = []
    for x, y in xy:
        v = angle * (complex(x, y) - offset) + offset
        newxy.append(v.real)
        newxy.append(v.imag)
    c.coords(polygon_item, *newxy)
 
c.bind("<Button-1>", press)
c.bind("<B1-Motion>", motion)
Dans mon code, j'appelle la fonction rotation à partir d'un menu...

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
 
def rotation(self, event):
		"""Permet de rotation les figures dans le sens souhaite a l aide d un clic sur un des sommets"""
		self.canvas.bind("<Button-1>", self.press)
		self.canvas.bind("<B1-Motion>", self.motion)
		self.canvas.bind('<ButtonRelease-1>',self.mouseup)
 
 
    def press(self, event):
		self.x,self.y=event.x,event.y
		self.tag=(self.canvas.find_closest(self.x,self.y, halo=None))[0]
		#self.figure=self.select(self.tag)
		self.figure=self.tag
		self.center=self.figure.absCentre, self.figure.ordCentre
		self.start = self.getangle(event)
		self.xy=zip([x for i, x in enumerate(self.canvas.coords(self.ID)) if i%2 == 0],[y for i, y in enumerate(self.canvas.coords(self.ID)) if i%2 == 1])
 
    def getangle(self, event):
		dx = self.canvas.canvasx(event.x) - self.center[0]
		dy = self.canvas.canvasy(event.y) - self.center[1]
		try:
			return complex(dx, dy) / abs(complex(dx, dy))
		except ZeroDivisionError:
			return 0.0 # cannot determine angle
 
    def motion(self, event):
		angle = self.getangle(event) / self.start
		offset = complex(self.center[0], self.center[1])
		newxy = []
		for x, y in self.xy:
			v = angle * (complex(x, y) - offset) + offset
			newxy.append(v.real)
			newxy.append(v.imag)
		self.figure.rotation(self.canvas, *newxy)
Maintenant, quand je lance le script, et que je clique sur le bouton pivoter , il me renvoie des erreurs du type :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
ObjType=self.canvas.gettags(self.selObject)[0]
IndexError: tuple index out of range
Alors j'ai essayé de suivre le chemin, et je pense que ça bloque au niveau de la fonction press... mais bon je bloque .

Merci d avance.