#-------------------------------------------------------------------- # funz7.py - by Claudio Fin marzo 2008 #-------------------------------------------------------------------- import Tkinter from math import sin,cos,pi #-------------------------------------------------------------------- # Tracciamento grafico in coord.relative #-------------------------------------------------------------------- class Grafico: minpx = maxpx = minpy = maxpy = 0 minx = maxx = miny = maxy = 0.0 kx = kx2 = ky = ky2 = 0.0 ampl = 0.0 color = style = "" xarray = [] yarray = [] canvas = None #---------------------------------------------------------------- def ymap(self,y): return round( y * self.ky - self.ky2 ) def xmap(self,x): return round( x * self.kx - self.kx2 ) #---------------------------------------------------------------- def assex(self,y): if self.style=="d": self.canvas.create_line(self.xmap(self.minx),self.ymap(y), self.xmap(self.maxx),self.ymap(y), fill=self.color, dash=1, arrow="last") else: self.canvas.create_line(self.xmap(self.minx),self.ymap(y), self.xmap(self.maxx),self.ymap(y), fill=self.color, arrow="last") #---------------------------------------------------------------- def assey(self,x): if self.style=="d": self.canvas.create_line(self.xmap(x), self.ymap(self.miny), self.xmap(x),self.ymap(self.maxy), fill=self.color, dash=1, arrow="last") else: self.canvas.create_line(self.xmap(x), self.ymap(self.miny), self.xmap(x),self.ymap(self.maxy), fill=self.color, arrow="last") #---------------------------------------------------------------- def setcoord(self, canvas, x, y, lar, alt, minx, maxx, miny, maxy): """ x e y sono le coordinate di origine in alto a sinistra dell'area grafica per la funzione, lar e alt sono la larghezza e altezza in pixel dell'area minx,maxx sono i valori real min e max dell'asse x miny,maxy sono i valori real min e max dell'asse y """ self.minpx = x self.maxpx = x + lar - 1 self.minpy = y + alt - 1 self.maxpy = y self.minx = minx self.maxx = maxx self.miny = miny self.maxy = maxy self.kx = (self.maxpx-self.minpx) / (self.maxx-self.minx) self.kx2 = self.minx * self.kx - self.minpx self.ky = (self.maxpy-self.minpy) / (self.maxy-self.miny) self.ky2 = self.miny * self.ky - self.minpy self.canvas = canvas #---------------------------------------------------------------- def plotta(self): if len(self.xarray)==0: return x1=self.xarray[0] y1=self.yarray[0] for i in xrange(1,len(self.xarray)): x2=self.xarray[i] y2=self.yarray[i] self.canvas.create_line(self.xmap(x1), self.ymap(y1), self.xmap(x2), self.ymap(y2), fill=self.color) x1, y1 = x2, y2 #---------------------------------------------------------------- def calcpunti(self, min, max): return int( round( self.xmap(max)-self.xmap(min)+1 ) ) #---------------------------------------------------------------- def delete(self): self.canvas.delete("all") del self.xarray[:] del self.yarray[:] #-------------------------------------------------------------------- class Finestra: contat = 0 direz = 10 def __init__ (self): self.form1=Tkinter.Tk() self.frame1=Tkinter.Frame(self.form1) self.frame2=Tkinter.Frame(self.form1) self.canv1=Tkinter.Canvas(self.frame2) self.canv1.configure(width=450, height=300, bg="black") self.frame1.grid(row=0, column=0, sticky="ns") self.frame2.grid(row=0, column=1, sticky="ns") self.canv1.grid(row=0, column=0) self.animazione() def animazione(self): self.contat += self.direz if self.contat>=100: self.direz = -10 if self.contat<=-100: self.direz = 10 G.ampl=self.contat/100.0 disegnafunzione(self.canv1) self.canv1.after(40, self.animazione) #-------------------------------------------------------------------- def funzione(x): return sin(x*2)*cos(5*x) #-------------------------------------------------------------------- # DISEGNA FUNZIONE - usa gli oggetti G e F #-------------------------------------------------------------------- def disegnafunzione(canvas): #definisce coordinate relative in area grafica G.setcoord(canvas, 20, 20, 400, 250, -0.5, 7, -1.4, 1.4) G.delete() #disegna assi passanti per lo zero G.color="gray" G.style="d" G.assex(0.0) G.assey(0.0) #imposta colore funzione G.color="yellow" G.style="s" #imposta estremi x funzione e numero di punti minx = 0.0 maxx = pi * 2 punti = G.calcpunti(minx, maxx)/2 #calcolo punti funzione in array G.xarray G.yarray G.xarray.append( minx ) G.yarray.append( funzione(minx)*G.ampl ) segm = (maxx-minx)/(punti-1) for h in xrange(1,punti): x= minx + segm * h G.xarray.append( x ) G.yarray.append( funzione(x)*G.ampl ) #tracciamento funzione G.plotta() #-------------------------------------------------------------------- G = Grafico() #crea oggetto disegno grafico F = Finestra() #crea oggetto finestra grafica F.form1.mainloop() #avvia ciclo eventi finestra