Il dragone una idea sviluppata tante volte ma sempre carina

Si prenda una strisciolina di carta la si pieghi a metà e poi ...

In [1]:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import array as arr
import numpy as np

Per iniziare la classe piega: la piega è memorizzata con una lettera

  • A giù
  • B dx
  • C su
  • D sx

title

si parte da AB prima piega poi come si può notare la seconda parte è la stessa ma ruotata di $\frac{\pi}{2}$

In [2]:
class piega:
    def __init__(self, dr):
        self.dr = dr
    
    def failapiega(self):
        stringa=self.dr
        l=len(stringa)
        pdrago=""
        p1='U'
        i=l-1
        #si legge la stringa al contrario e si duplica ruotando di pi/2
        while i>=0:
            p=stringa[i]
            if p=='A':
                p1='B'
            if p=='B':
                p1='C'
            if p=='C':
                p1='D'
            if p=='D':
                p1='A'
            i=i-1
            pdrago=pdrago+p1
        
        #qui si unisce la stringa in ingresso con quella ruotata di pi/2 nel while 
        return stringa+pdrago
In [3]:
class disegna:
    def __init__(self,dr1):
        self.dr1=dr1
        
    def traccia(self):
        stringa=self.dr1
        l=len(stringa)
        x=0
        y=0
        delta=1
        puntiX=arr.array('l')
        puntiY=arr.array('l')
        puntiX.append(x)
        puntiY.append(y)
        delta=1
        for k in range(1,l-1):
            if stringa[k]=='A':
                y=y-delta
            elif stringa[k]=='B':
                x=x+delta
            elif stringa[k]=='C':
                y=y+delta
            elif stringa[k]=='D':
                x=x-delta
            else:
                #default
                pass
            puntiX.append(x)
            puntiY.append(y)
        plt.figure(figsize=(10,10))
        plt.axes().set_aspect('equal', 'datalim')
        plt.plot(puntiX, puntiY, 'r-', label='line 2')
        plt.show()
    
    def traccia_numpy(self):
        stringa=self.dr1
        l=len(stringa)
        x=0
        y=0
        delta=1
        puntiX = [x]
        puntiY = [y]
        delta=1
        for k in range(1,l-1):
            if stringa[k]=='A':
                y=y-delta
            elif stringa[k]=='B':
                x=x+delta
            elif stringa[k]=='C':
                y=y+delta
            elif stringa[k]=='D':
                x=x-delta
            else:
                #default
                pass
            puntiX.append(x)
            puntiY.append(y)
        puntiX = np.array(puntiX, dtype=np.int64)
        puntiY = np.array(puntiY, dtype=np.int64)
        plt.figure(figsize=(10,10))
        plt.axes().set_aspect('equal', 'datalim')
        plt.plot(puntiX, puntiY, 'r-', label='line 2')
        plt.show()
In [4]:
stringa='AB'
#attenzione diventa subito molto grande ... non esagerare con le iterazioni
for k in range(0,20):
    passo=piega(stringa)
    stringa=passo.failapiega()
drago=disegna(stringa)
drago.traccia_numpy()
In [ ]: