import matplotlib.pyplot as plt
from math import cos,sin,pi

### Paramètres

a=2*pi/26 # angle entre deux cases dans le Cercle de César
r1=1 # rayon du premier Cercle
r2=1.5
r3=2

vitesse=0.4 # vitesse de roation du cercle tournant

A=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

### Fonctions Annexes

def segment(P1,P2):
    """ Trace un segment du point P1 au point P2"""
    plt.plot([P1[0],P2[0]],[P1[1],P2[1]],color='b')

def Cercle(r):
    """ Trace un cercle centré à l'origine de rayon r en approximant par un polygone régulier de 100 cötés"""
    X=[r*cos(2*pi*k/100) for k in range(101)]
    Y=[r*sin(2*pi*k/100) for k in range(101)]
    plt.plot(X,Y,color='b')
    plt.axis('equal')

### Programme Principal

def Cesar(decalage):
    """ Tourne le disque extérieur des cercles de César de la position initiale (Cercle en phase) jusqu'à la position décalée pour pouvoir lire un message codé """
    theta=0 # angle de décalage entre le Cercle intérieur fixe et le Cercle tournant extérieur
    while theta<decalage*a: #
        for i in range(26): # Tracé des cases des deux cercles
            segment((r1*cos(i*a),r1*sin(i*a)),(r2*cos(i*a),r2*sin(i*a)))
            segment((r2*cos(i*a+theta),r2*sin(i*a+theta)),(r3*cos(i*a+theta),r3*sin(i*a+theta)))
        Cercle(r1)
        Cercle(r2)
        Cercle(r3)
        for k in range(26): # Alphabet sur le Cercle intérieur fixe
            plt.text((r1+r2)/2*cos(k*a+a/2),(r1+r2)/2*sin(k*a+a/2),A[k])
        for k in range(26): # Alphabet sur le Cercle tournant extérieur
            plt.text((r3+r2)/2*cos(k*a+a/2+theta),(r3+r2)/2*sin(k*a+a/2+theta),A[k])
        plt.pause(0.001) # pause pour éviter les beugs ...
        plt.clf() # on efface
        theta+=a*vitesse # et on recommence
    # on finit en laissant l'affichage avec le cercle extérieur bien décalé
    theta=decalage*a
    for i in range(26):
        segment((r1*cos(i*a),r1*sin(i*a)),(r2*cos(i*a),r2*sin(i*a)))
        segment((r2*cos(i*a+theta),r2*sin(i*a+theta)),(r3*cos(i*a+theta),r3*sin(i*a+theta)))
    Cercle(r1)
    Cercle(r2)
    Cercle(r3)
    for k in range(26):
        plt.text((r1+r2)/2*cos(k*a+a/2),(r1+r2)/2*sin(k*a+a/2),A[k])
    for k in range(26):
        plt.text((r3+r2)/2*cos(k*a+a/2+theta),(r3+r2)/2*sin(k*a+a/2+theta),A[k])