#! /usr/bin/env python
# -*- coding:Utf-8 -*-

"""
Dessin des graphiques élongation/temps.

fichier : 1_oscillo.py
auteur  : G. Swinnen (modifié Bob)
"""

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from math import sin, pi
import tkinter as tk

# Définition de classe ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class OscilloGraphe(tk.Canvas):
    """Canevas spécialisé, pour dessiner des courbes élongation/temps."""
    
    def __init__(self, master=None, larg=200, haut=150):
        """Constructeur du graphique : axes et échelle horizontaux."""
        super().__init__()  # appel au constructeur de la classe parente
        # width et height du Canvas reçoivent larg et haut
        self.configure(width=larg, height=haut)
        self.larg, self.haut = larg, haut
        # tracé des axes de référence :
        self.create_line(10, haut/2, larg, haut/2, arrow=tk.LAST)   # axe X
        self.create_line(10, haut-5, 10, 5, arrow=tk.LAST)          # axe Y
        # tracé d'une échelle avec 8 graduations :
        pas = (larg - 25) / 8.          # intervalles de l'échelle horizontale
        for t in range(1, 9):
            stx = 10 + t*pas        # +10 pour partir de l'origine
            self.create_line(stx, (haut/2) - 4, stx, (haut/2) + 4)
        
    def traceCourbe(self, freq=1, phase=0, ampl=10, coul='red'):
        "tracé d'un graphique élongation/temps sur 1 seconde"
        curve = []                       # liste des coordonnées
        pas = (self.larg - 25) / 1000.   # l'échelle X correspond à 1 seconde
        for t in range(0, 1001, 5):      # que l'on divise en 1000 ms.
            e = ampl * sin(2 * pi * freq * (t/1000.) - phase)
            x = 10 + (t*pas)
            y = (self.haut/2) - (e * self.haut/25)
            curve.append((x, y))
        n = self.create_line(curve, fill=coul, smooth=1)
        return n                         # n = numéro d'ordre du tracé

# Auto-test ====================================================================
if __name__ == '__main__':
    root = tk.Tk()
    graph = OscilloGraphe(root, 250, 180)
    graph.pack()
    graph.configure(bg ='ivory', bd =2, relief=tk.SUNKEN)
    graph.traceCourbe()
    # graph.traceCourbe(freq=3, phase=1.2, ampl=7, coul='purple')
    root.mainloop()
