buttons on interact acting twice first time

asked 2020-03-23 10:36:54 +0200

ortollj gravatar image

updated 2020-03-24 08:55:56 +0200

Hi

Ubuntu 18.04 Jupyter notebook SageMath 9.0

Q1):

I can't find why the first time I click on r or on t buttons it produces 2 rotations or 2 reflections, then only one as it should do, every other time.(maybe there is something wrong in my code ? ) (to enlarge the output cell, menu cell -> Current output → toggle scrolling and click on left side of the output cell)

Q2):

why this code do not work on SageCell , but works in my local server ?

precision: each time I change button then back to the other button is acting twice again !

or is there a bug in interact button ? https://ask.sagemath.org/question/483...

#%matplotlib notebook
#import matplotlib.pyplot as plt
#from matplotlib.animation import FuncAnimation
#import animatplot as amp
#
import numpy as np
from scipy.spatial import distance
from sage.plot.point import Point

#np.set_printoptions(linewidth=110)

""" choose side number of the 2D polygon """
var('n')
n=6

maL=[]
shiftAngle=-2*pi/(2*n)
for i in range(1,n+1) :
    maL.append([cos(i*2*pi/n+shiftAngle),sin(i*2*pi/n+shiftAngle)])

#mL=[[1,1],[-1,1],[-1,-1],[1,-1]]
m=matrix(maL).transpose()

max = 1.5 # figure span
figsizeV=5

def chooseColor(colorsNumber):
    if 'colorL' not in locals():
        colorL=[]
        for i in range(0,colorsNumber) :
            colorL.append([random(),random(),random()])
        #show(colorL)


    D=distance.cdist(colorL, colorL, 'cityblock')

    Dm=matrix(D)
    DvL=[]
    for v in (Dm.columns()):
        DvL.append((sum(v)))
    #show(DvL)




    keys = range(len(DvL))
    DvDict=dict(zip(DvL, keys))
    #show(DvDict)
    DvDictSorted={k: v for k, v in sorted(DvDict.items(), key=lambda item: item[0],reverse=True)}
    #show(DvDictSorted)

    colorSortedL=[]
    for key,val in DvDictSorted.items():
        colorSortedL.append(colorL[val])
        #print (key, "=>", val)
    return colorSortedL

rot=matrix(SR,[[cos(2*pi/n),-sin(2*pi/n)],[sin(2*pi/n),cos(2*pi/n)]])
#ref=matrix(SR,[[cos(2*2*pi/n),sin(2*2*pi/n)],[sin(2*2*pi/n),-cos(2*2*pi/n)]])
ref=matrix(SR,[[cos(pi),sin(pi)],[sin(pi),-cos(pi)]])

# fill up color list only if color list does not exist
try: colorSortedL
except NameError: colorSortedL = None

if colorSortedL ==None :

    colorSortedL=chooseColor(2*n)
    #print("https://www.youtube.com/watch?v=L5GEnUuhilw&t=204s")

    #show(LatexExpr(r"\mathrm{rotation_{matrix}} = \begin{bmatrix}\cos{2\pi \over n} & -\sin{2\pi \over n} \\[8pt] \sin{2\pi \over n} & \cos{2\pi \over n}\end{bmatrix} "))
    #show(LatexExpr(r"\mathrm{reflexion_{matrix}} = \left(\begin{array}{rr} \cos 2 \theta & \sin 2 \theta  \\ \
    #                                     \sin 2 \theta  & -\cos 2 \theta \end{array}\right)"))
    #show("rotation Matrix :\t",rot)
    #show("reflexion Matrix :\t",ref)
    #show(maL)
#show(colorSortedL)



def getRotAndReflexionMatrix(rotAndRefSerie) :

    global m
    #show(rot,ref)
    global rotAndReflexionMatricesL
    global rotAndRefMemo
    mrt=m
    #show("rotAndRefMemo before:\t", rotAndRefMemo,"rotAndRefSerie :\t", rotAndRefSerie)
    rotAndRefMemot=deepcopy(deepcopy(rotAndRefMemo) + deepcopy(rotAndRefSerie))
    #show("rotAndRefMemo :\t", rotAndRefMemot,"rotAndRefSerie :\t", rotAndRefSerie)
    rotAndReflexionMatricesL=[]
    for c in rotAndRefMemot :
        if c=='r' :
            mrt=rot*mrt
            rotAndReflexionMatricesL.append(mrt)

        elif c=='t' :
            mrt=ref*mrt
            rotAndReflexionMatricesL.append(mrt)
        elif c=='c' :
            #clear
            mrt=m
            rotAndReflexionMatricesL=[m]
            rotAndRefMemot=[ ]

        else :
            #clear
            mrt=m
            rotAndReflexionMatricesL=[ ]
            rotAndRefMemot=[ ]

            print("only i or r or t please")
    #show("rotAndRefMemo :\t", rotAndRefMemo,"rotAndRefSerie :\t", rotAndRefSerie)
    rotAndRefMemo=deepcopy(rotAndRefMemot)
    return mrt



def buildMatriceFigPlots(matricesL):
    figPlotsL=[]
    figPlot=plot(0, ymin=-1.25, ymax=1.25)

    for matrice in matricesL :
        matriceL=list(matrice.transpose())
        figPlot=(list_plot(matriceL,color='black',size=40,figsize=(figsizeV,figsizeV)))
        for i in range(0,len(matriceL)) :
            #show(matriceL[i])
            figPlot+=text(str(i), matriceL[i], fontsize=50, rgbcolor=colorSortedL[i] )
            figPlot+= polygon([matriceL[i],matriceL[(i+1)%n],(0,0)],fill=True, thickness=4, rgbcolor=colorSortedL[i])

        figPlot += circle((0,0), 1)
        #figPlot += polygon(matriceL,fill=False, thickness=4, color='orange')

        figPlotsL.append(figPlot)
    #for c in range(0,t.dimensions()[1]) :
            #for r in range(0,t.dimensions()[0]) :
            #    show(r,":\t",r,":\t",t[r,c])
    return figPlotsL


try: rotAndReflexionMatrix
except NameError: rotAndReflexionMatrix = None

if rotAndReflexionMatrix ==None :
    rotAndReflexionMatrix=m

try: rotAndReflexionMatricesL
except NameError: rotAndReflexionMatricesL = None

if rotAndReflexionMatricesL ==None :
    rotAndReflexionMatricesL=[]

try: rotAndRefMemo
except NameError: rotAndRefMemo = None
#    
if rotAndRefMemo ==None :
    rotAndRefMemo=[]

try: matricesFigPlotsL
except NameError: matricesFigPlotsL = None

if matricesFigPlotsL ==None :
    matricesFigPlotsL=[]    


animateTest=False

from IPython.core.display import display, HTML
#display(HTML("<style>.container { height:100% !important; }</style>"))
display(HTML("<style>.container { width:80% !important; }</style>"))


@interact
def _(aMap=selector(['c','r', 't'],buttons=True)):
    rotAndRef=list(aMap)
    #show("rotAnd Reflexion sequence: \t",rotAndRef)

    global rotAndReflexionMatrix 
    global rotAndReflexionMatricesL
    rotAndReflexionMatrix=getRotAndReflexionMatrix(rotAndRef)
    #show("rotAndReflexionMatrix : \t",rotAndReflexionMatrix)

    #show("rotAndReflexionMatricesL : \t",rotAndReflexionMatricesL)

    # plot list of matrices
    matricesFigPlotsL=buildMatriceFigPlots(rotAndReflexionMatricesL)

    if animateTest :
        # show animated sequence
        a=animate(matricesFigPlotsL,ymin=-max,ymax=max,axes_labels=['x','y'],fontsize=14,figsize=(figsizeV,figsizeV))
        a.show(delay=200,iterations=1)
    else:
        #only show the completed sequence at the end
        if matricesFigPlotsL!=[] :
            show(matricesFigPlotsL[-1])
edit retag flag offensive close merge delete