
import math
from tkinter import *
import tkinter.font as tkfont
import tkinter.filedialog as dialog

#### Creation fenetre ####
fenetre = Tk()

Canevas = Canvas(fenetre,width = 1100, height =500,borderwidth=5,relief="raised",background='white')
Canevas.pack(side=TOP,pady=5)

Canevas.delete(ALL)

#### Creation batcurveh ####
#### de -7 à 7 avec 100 points par unités ; origine à 710 ####
#### en y valeurs de -3 à 3 avec 100 points par unités ; origine à 350 ####
#### VERSION PORTABLE : largeur 1400*0.75 = 1050, hauteur 600*0.75=450 ####

batcurveh=[]

for i in range(-700,-300):
    x=float(i)/100
    y=300*math.sqrt(1-(x**2)/(7**2))
    batcurveh.append(y)
    
for i in range(-300,-100):
    x=float(i)/100
    y=100*((6*math.sqrt(10)/7+(1.5+x/2))-(6*math.sqrt(10)/14)*math.sqrt(4-(1+x)**2)) 
    batcurveh.append(y)
    
for i in range(-100,-75):
    y=900+8*float(i)
    batcurveh.append(y)
    
for i in range(-75,-50):
    y=-3*float(i)+75
    batcurveh.append(y)
    
for i in range(-50,1):
    batcurveh.append(225)
    
for i in range(1,701):
    batcurveh.append(batcurveh[700-i])


#### Creation batcurveb ####
#### de -7 à 7 avec 100 points par unités ; origine à 710 ####
#### en y valeurs de -3 à 3 avec 100 points par unités ; origine à 350 ####

batcurveb=[]

for i in range(-700,-400):
    x=float(i)/100
    y=-300*math.sqrt(1-(x**2)/(7**2))
    batcurveb.append(y)
    
for i in range(-400,1):
    x=float(i)/100
    y=100*( (-x/2-(3*math.sqrt(33)-7)*(x**2)/112-3) + math.sqrt(1-((abs(x+2)-1)**2)))
    batcurveb.append(y)
    
    
for i in range(1,701):
    batcurveb.append(batcurveb[700-i])


#### Calcul Fourierh et Fourierb ####
Fourierh=[]

for n in range(0,700):
    coef=0
    k=2*n+1
    for i in range(0,1400):
        x=i/1400*math.pi
        coef=coef+batcurveh[i]*math.sin(k*x)/700
    Fourierh.append(coef)

Fourierb=[]

for n in range(0,700):
    coef=0
    k=2*n+1
    for i in range(0,1400):
        x=i/1400*math.pi
        coef=coef+batcurveb[i]*math.sin(k*x)/700
    Fourierb.append(coef)


#### Dessin du graphe compresse avec N coefs Fourier ####
#### VERSION PORTABLE : largeur 1400*0.75 = 1050, hauteur 600*0.75=450 ####
#### origine y a 250, origine x a 550 ####

def dessin(pif):
    global Fourierh, Fourierb
    NN = nfourier.get()
    nfourier_text=str(NN)
    case.delete(0,END)
    case.insert(1,nfourier_text)
    Canevas.delete(ALL)
    Canevas.create_line(25,250,1075,250,fill='black',width=1)
    Canevas.create_text(15,250,text='0',font=("Arial",25))
    Canevas.create_text(1085,250,text='1',font=("Arial",25))
    for i in range(0,1050):
        x1=float(i)/1050*math.pi
        x2=float(i+1)/1050*math.pi
        y1=0
        y2=0
        for n in range(0,NN):
           y1=y1+Fourierh[n]*math.sin((2*n+1)*x1)
           y2=y2+Fourierh[n]*math.sin((2*n+1)*x2)
        y1=250-int(y1*0.75)
        y2=250-int(y2*0.75)
        Canevas.create_line((25+i), y1, (26+i), y2, fill='red', width=2)
        y1=0
        y2=0
        for n in range(0,NN):
           y1=y1+Fourierb[n]*math.sin((2*n+1)*x1)
           y2=y2+Fourierb[n]*math.sin((2*n+1)*x2)
        y1=250-int(y1*0.75)
        y2=250-int(y2*0.75)
        Canevas.create_line((25+i), y1, (26+i), y2, fill='blue', width=2)

def dessin_text(pif):
    global Fourierh, Fourierb
    NN = int(nfourier_text.get())
    nfourier.set(NN)
    Canevas.delete(ALL)
    Canevas.create_line(25,250,1075,250,fill='black',width=1)
    Canevas.create_text(15,250,text='0',font=("Arial",25))
    Canevas.create_text(1085,250,text='1',font=("Arial",25))
    for i in range(0,1050):
        x1=float(i)/1050*math.pi
        x2=float(i+1)/1050*math.pi
        y1=0
        y2=0
        for n in range(0,NN):
           y1=y1+Fourierh[n]*math.sin((2*n+1)*x1)
           y2=y2+Fourierh[n]*math.sin((2*n+1)*x2)
        y1=250-int(y1*0.75)
        y2=250-int(y2*0.75)
        Canevas.create_line((25+i), y1, (26+i), y2, fill='red', width=2)
        y1=0
        y2=0
        for n in range(0,NN):
           y1=y1+Fourierb[n]*math.sin((2*n+1)*x1)
           y2=y2+Fourierb[n]*math.sin((2*n+1)*x2)
        y1=250-int(y1*0.75)
        y2=250-int(y2*0.75)
        Canevas.create_line((25+i), y1, (26+i), y2, fill='blue', width=2)
    
#### Dessin du graphe ####
#
#for i in range(0,1399):
#    y1 = 350-int(batcurveh[i])
#    y2 = 350-int(batcurveh[i+1])
#    Canevas.create_line((10+i), y1, (11+i), y2, fill='red', width=2)
#    y1 = 350-int(batcurveb[i])
#    y2 = 350-int(batcurveb[i+1])
#    Canevas.create_line((10+i), y1, (11+i), y2, fill='blue', width=2)


#### impression ####
def imprime():
## Renvoie au passage les 10 premiers coefs
#    global Fourierh, Fourierb
#    for n in range(0,10):
#        print(str(Fourierh[n]/1200))
#    for n in range(0,10):
#        print(str(Fourierb[n]/1200))
    Canevas.update()
    fichier=dialog.asksaveasfilename(filetypes=[("PS","*.ps")],title='Fichier postscript cible')
    Canevas.postscript(file=fichier, colormode='color')

    


#### echelle ####
harmos = Frame(fenetre,borderwidth=1)
text = Label(fenetre,text="Nombre de coefficients de Fourier",font=("Arial",20,"bold"))
text.pack(pady=10)

nfourier=IntVar()
nfourier.set(0)
echelle=Scale(fenetre, variable=nfourier,from_=0,to=200,font=("Helvetica",18),tickinterval=20,width=20,length=900,orient="horizontal",command=dessin)
echelle.pack(side=LEFT,padx=50)

nfourier_text=StringVar()
nfourier_text.set("0")
case = Entry(harmos, textvariable=nfourier_text, width=5,font=("Helvetica",18))
case.pack(side=RIGHT,padx=5)
case.delete(0,END)
case.insert(1,"0")
case.bind("<Return>",dessin_text)
harmos.pack(side=LEFT)

boutons= Frame(fenetre,borderwidth=1)
bouton_joue = Button(boutons,font=("Arial",15), text="Imprimer", command = imprime)
bouton_quitter = Button(boutons,font=("Arial",15), text="Quitter", command = fenetre.destroy)
bouton_quitter.pack(side=BOTTOM,pady=10)
bouton_joue.pack(side=TOP,pady=10)

boutons.pack(side=RIGHT,padx=10)
fenetre.mainloop()
