# Créé par Fred, le 30/12/2012 from __future__ import division from lycee import * from Tkinter import * from random import randrange from time import sleep #exercices 5.9.2 à 5.9.4 ''' def dessinligne(): global x1, y1, x2, y2, coul,large,haut x2=randrange(large) y2=randrange(haut) can.create_line(x1,y1,x2,y2,width=1,fill=coul) x1, y1 = x2, y2 def changecouleur(): global coul cl=['purple','cyan','maroon','green','red','blue','orange','yellow'] coul=cl[randrange(8)] x1, y1, x2, y2 = 10, 190, 190, 10 large, haut = 300,200 coul = 'cyan' fenetre = Tk() can = Canvas(fenetre,bg='ivory',height=haut,width=large) can.grid(column=0,row=0,rowspan=10) bou1 = Button(fenetre,text='Quitter',command=fenetre.quit) bou1.grid(column=1,row=9,sticky=W) bou2 = Button(fenetre,text=u'Tracé d\'une ligne', command=dessinligne) bou2.grid(column=1,row=0,sticky=W) bou3 = Button(fenetre,text='Autre couleur',command=changecouleur) bou3.grid(column=1,row=1,sticky=W) fenetre.mainloop() ''' #exercice 5.9.7 ''' def dessin_rectangle(): global deja,nrect,L x0=pos_souris[0] y0=pos_souris[1] for k in range(nrect): ux=x0+direct[0]*k*ecartx+randrange(ecartx) uy=y0+direct[1]*k*ecarty+randrange(ecarty) x=int(ux) y=int(uy) u=x,y,x+ecartx,y+ecarty if deja==0: L.append(can.create_rectangle(u,fill=cl[k%len(cl)])) else: can.coords(L[k],u) sleep(0.01) deja=deja+1 fenetre.update() def bouge(event): global pos_souris,anc_pos,deja,direct if deja<0:deja=0 pos_souris=[event.x,event.y] u=math.atan2(pos_souris[1]-anc_pos[1],pos_souris[0]-anc_pos[0]) p=math.pi direct=(cos(p-u),sin(u-p)) etiquette.config(text=str(u)+'° ('+str(direct[0])+','+str(direct[1])+')') dessin_rectangle() anc_pos=pos_souris """---------------------------------------------------------------------------""" cl=['purple','cyan','maroon','green','red','blue','orange','yellow'] large, haut = 600,600 pos_souris=[300,300];anc_pos=pos_souris;direct=(1,0) deja=-1;nrect=20;L=[];ecartx=15;ecarty=10 fenetre = Tk() can = Canvas(fenetre,bg='ivory',height=haut,width=large) can.grid(column=0,row=0) bou1 = Button(fenetre,text='Quitter',command=fenetre.quit) bou1.grid(column=1,row=1) etiquette=Label(fenetre) etiquette.grid(column=0,row=1) can.bind('',bouge) fenetre.mainloop() ''' #exercice 5.9.12 ''' def distance_astres(etat): d=((as1[0]-as2[0])**2+(as1[1]-as2[1])**2)**0.5 return d def force_grav(d): G=(haut**2+large**2)**0.5 #6.7e-11 if d==0:return as1[5]*as2[5]/G else: return as1[5]*as2[5]/(d**2) def dessinastres(etat): ds=distance_astres(etat) maxF=force_grav(0) if ds>0.1: F=force_grav(ds) h_rectF=int(0.9*haut*F/maxF) else: F=1;h_rectF=0.9*haut S='distance = '+"%5.2f" % ds+' / force = '+"%7f" %F etiquette.configure(text=S) if etat==0: can.create_rectangle(large-50,haut,large-10,haut-h_rectF,fill='grey',tags='t4') can.create_oval(as1[0]-as1[2],as1[1]-as1[2],as1[0]+as1[2],as1[1]+as1[2],fill=as1[4],tags='as1') can.create_text(as1[0],as1[1]+2*as1[2],text='M1='+str(as1[5]),fill=as1[6],tags='t1') can.create_oval(as2[0]-as2[2],as2[1]-as2[2],as2[0]+as2[2],as2[1]+as2[2],fill=as2[4],tags='as2') can.create_text(as2[0],as2[1]+2*as2[2],text='M2='+str(as2[5]),fill=as2[6],tags='t2') can.create_line(as1[0],as1[1],as2[0],as2[1],tags='t3') elif etat==1: can.coords('as1',as1[0]-as1[2],as1[1]-as1[2],as1[0]+as1[2],as1[1]+as1[2]) can.coords('t1',as1[0],as1[1]+2*as1[2]) can.itemconfigure('as1',fill=as1[4]) can.coords('as2',as2[0]-as2[2],as2[1]-as2[2],as2[0]+as2[2],as2[1]+as2[2]) can.itemconfigure('as2',fill=as2[4]) can.coords('t2',as2[0],as2[1]+2*as2[2]) can.coords('t3',as1[0],as1[1],as2[0],as2[1]) can.coords('t4',large-50,haut,large-10,haut-h_rectF) fenetre.update() def clic(event): global pos_souris, as_actif,as1, as2 pos_souris=[event.x,event.y] if as_actif!=0: as_actif=0; as1[4]='cyan';as2[4]='orange' else: if (as1[0]-as1[2]',clic) can.bind('',bouge) fenetre.mainloop() ''' """---------------------------------------------------------------------------""" #exercice 5.9.14 def calcul_axe(min, max, np): La=[] h=(max-min)/np m=round(math.log(abs(h),10)) if m>0:h=(10**-m)*round(10**m*(max-min)/np) elif m<0:h=(10**m)*round((10**-m)*(max-min)/np) if min<=0 and max>=0:centre=0 else: centre=(min+max)/2 if m>0:centre=(10**-m)*round(centre*10**m) else:centre=(10**m)*round(centre*(10**-m)) La=[centre] u=centre;v=centre while umin:v=v-h;La=[v]+La return m,La def dessin_axe(min, max, np,long,ori,m,e,taille_car): mm,La=calcul_axe(min,max,np) nl=len(La) minL=La[0];maxL=La[nl-1] ka=long/(maxL-minL) Da=[];Ta=[];Tt=[];Tl=[];s='axe' for k in range(nl): u=(La[k]-minL)*ka if ori=='H':A=u,m-e,u,m+e;AT=u,0,u,long else: A=m-e,haut-u,m+e,haut-u;AT=0,haut-u,long,haut-u Da=Da+[u] Ta=Ta+[can.create_line(A,tags=s)] Tl=Tl+[can.create_line(AT,dash=(1,4),tags='T')] st="%.2f" %La[k] if ori=='H':B=u,m-taille_car-e else:B=m+taille_car*abs(mm)+e,haut-u-taille_car Tt=Tt+[can.create_text(B,text=st,font=('Arial',str(taille_car)),tags=s)] if ori=='H':A=Da[0],m,Da[nl-1],m else: A=m,Da[0],m,Da[nl-1] can.create_line(A,tags=s) return maxL,minL,nl def dessin_2axes(minx,maxx,npx,miny,maxy,npy,mx,my,e): global npaxe_x,npaxe_y a,b,npaxe_x=dessin_axe(minx, maxx, npx,large,'H',mx,e,8) a,b,npaxe_y=dessin_axe(miny, maxy, npy,haut,'V',my,e,8) return a,b,npaxe_x,npaxe_y def fonction(x): return x**2 def calc_courbe(a,b,n): L=[];h=(b-a)/n;x=a maxL=-inf;minL=inf for k in range(n): y=fonction(x) if y>maxL:maxL=y if y=0:my=haut-int(0-minL*ky) else: my=haut-ec if a<0 and b>0:mx=int(-a*kx) else: mx=ec maxL,minL,nx,ny=dessin_2axes(a,b,nx,minL,maxL,ny,my,mx,ec) return D def cherche_point(x,y): global D,ec k=0;trouve=False etiquette.config(text='D='+str(D[k])) while not trouve or k>n-1: u=can.coords(D[k]) trouve=abs(u[0]-x)n-1: u=can.coords(D[k]) trouve=(u[0]-pos_souris[0])**2+(u[1]-pos_souris[1])**2<3*ec**2 k=k+1 if trouve : anc_pos=[u[0],u[1]] if not trouve and bouge_c:bouge_c=False def bouge(event): global pos_souris,anc_pos,bouge_c pos_souris=[event.x,event.y] if bouge_c: dx,dy=pos_souris[0]-anc_pos[0],pos_souris[1]-anc_pos[1] etiquette.config(text='bouge...'+str(dx)+' ; '+str(dy)) can.move('courbe',dx,dy) anc_pos=pos_souris def aff_grille(): global ok_grille ok_grille=not ok_grille if ok_grille:can.itemconfig('T',state='normal') else:can.itemconfig('T',state='hidden') def aff_axes(): global ok_axes ok_axes=not ok_axes if ok_axes:can.itemconfig('axe',state='normal') else:can.itemconfig('axe',state='hidden') large, haut = 600,600 pos_souris=[0,0];anc_pos=pos_souris;inf=1e320 L=[];D=[];a=-3;b=2;n=100;deja=0;ec=2 nx,ny=12,12; bouge_c=False;ok_grille=True;ok_axes=True fenetre = Tk() can = Canvas(fenetre,bg='ivory',height=haut,width=large) can.grid(column=0,row=0,rowspan=30) bou1 = Button(fenetre,text='Grille',command=aff_grille) bou1.grid(column=1,row=0,sticky=W) bou2 = Button(fenetre,text='Axes',command=aff_axes) bou2.grid(column=1,row=1,sticky=W) bou3 = Button(fenetre,text='Quitter',command=fenetre.quit) bou3.grid(column=1,row=2,sticky=W) etiquette=Label(fenetre) etiquette.grid(column=0,row=30) can.bind('',clic) can.bind('',bouge) D=trace_courbe(a,b,n) fenetre.mainloop()