interpolation.py

#
# Polynomial interpolation
# Vincent Legat - 2020
# Ecole Polytechnique de Louvain
#

from tkinter import *
from numpy   import polyfit,polyval


# =========================================================================

def mouse(event):
  global X,U
  print("New data : " + str(event.x) + "," + str(event.y))
  x1,y1 = (event.x - 5),(event.y - 5)
  x2,y2 = (event.x + 5),(event.y + 5)
  myCanvas.create_oval(x1,y1,x2,y2,fill='red')
  X.append(event.x)
  U.append(event.y)

# =========================================================================

def cleanCallBack():
  global X,U
  X,U=[],[]
  myCanvas.delete('all')

# =========================================================================

def computeCallBack():
  global X,U,myWindow
  myCanvas.delete('curve')
  if (len(X) >= 2):
    myPolynomial = polyfit(X,U,len(X)-1,rcond=2e-64)
    curve = []
    for x in range(0,myWindow.winfo_width(),1):
      uh = polyval(myPolynomial,x)
      curve.append((x,uh))
    myCanvas.create_line(curve,fill='blue',smooth=1,tag='curve')

# ============================= mainProgram ===============================

X,U=[],[]

myWindow = Tk()
myWindow.geometry('570x420')
myWindow.title('Interpolation')
myCanvas = Canvas(myWindow,width=570,height=420,bg='white')
myCanvas.bind('<Button-1>',mouse)
myCanvas.pack(fill='both',expand=True)

computeButton = Button(myWindow,text='Compute',command=computeCallBack)
computeButton.place(x=20,y=30,width=120,height=25)
cleanButton = Button(myWindow,text='Clean',command=cleanCallBack)
cleanButton.place(x=20+130,y=30,width=120,height=25)
exitButton = Button(myWindow,text='Exit',command=myWindow.quit)
exitButton.place(x=20+260,y=30,width=120,height=25)

myWindow.mainloop()

# =========================================================================