printerbannerを行列を使って回転する



アニメ『弱虫ペダル』
今年は第三期も始まったアニメです。ペダルの回し方とっても大事です。

ではprinterbanner表示を行列を使って回してみます。

banner表示をそのまま反転してしまうと、マイナス座標になってしまいますので、反転したらプラスになるようにxをa分移動させてマイナス値にしておきます。

マイナス値にしたら反転させるために行列の積算を行い、banner文字が端末画面上で表示されるイメージです。

計算式はこのようになります。

\[
\left(
\begin{array}{c}
x’ \\
y’
\end{array}
\right)
=
\left(
\begin{array}{cc}
-1 & 0 \\
0 & 1
\end{array}
\right)
\left( \left(
\begin{array}{c}
x \\
y
\end{array}
\right)
+
\left(
\begin{array}{c}
a \\
0
\end{array}
\right)
\right)
\]

スクリプトです

     1	import sys
     2	from numpy import *
     3	from subprocess import Popen, PIPE
     4	
     5	cmd="printerbanner a"
     6	p = Popen(cmd.split(' '), stdout=PIPE, stderr=PIPE)
     7	result, err = p.communicate()
     8	
     9	arr = [[0 for x in range(300)] for y in range(300)]
    10	
    11	y=0
    12	for line in result.split('\n')[:-2]:
    13		x=0
    14		for ch in list(line)[30:]:
    15			if ch == '#':
    16				xy=matrix('%d;%d' %(x,y))
    17				xx,yy=matrix('-1 0;0 1')*(xy-matrix('54;0'))
    18				arr[int(yy)][int(xx)]='#'
    19			x=x+1
    20		y=y+1
    21	
    22	for y in range(43):
    23		for x in range(60):
    24			ch=arr[y][x]
    25			if ch != '#':ch=' '
    26			sys.stdout.write(ch)
    27		print
    28	

実行するとこのようになります。

                                   ########                 
                               ################             
                             ####################           
         #####             ########################         
      ##########          ##########################        
    #############        ############################       
   ##############       ##############################      
  ###############       #########            #########      
  ##############       ########                ########     
 ######   ####         #######                  #######     
 #####                 ######                    ######     
 ####                  ######                    ######     
 ####                  ######                    ######     
 ####                   #####                    #####      
 #####                  #####                    #####      
 ######                  #####                  #####       
 #######                  #####                #####        
  #########                ######            ######         
  ################################################          
   #################################################        
    #################################################       
     #################################################      
      #################################################     
        ###############################################     
          #############################################     
              #########################################     
                                                 ######     
                                                   ####     
                                                    ###     
                                                     ##     
    

次は20°回転させてみます。




\[
\left(
\begin{array}{c}
x’ \\
y’
\end{array}
\right)
=
\left(
\begin{array}{cc}
-1 & 0 \\
0 & 1
\end{array}
\right)
\left( \left(
\begin{array}{c}
x \\
y
\end{array}
\right)
+
\left(
\begin{array}{c}
a \\
0
\end{array}
\right)
\right)
\]

スクリプトです。

     1	import sys
     2	from numpy import *
     3	from math import *
     4	from subprocess import Popen, PIPE
     5	
     6	cmd="printerbanner a"
     7	p = Popen(cmd.split(' '), stdout=PIPE, stderr=PIPE)
     8	result, err = p.communicate()
     9	
    10	arr = [[0 for x in range(300)] for y in range(300)]
    11	
    12	r=-pi*20/180
    13	y=0
    14	for line in result.split('\n')[:-2]:
    15		x=0
    16		for ch in list(line)[30:]:
    17			if ch == '#':
    18				xy=matrix('%d;%d' %(x,y))
    19				xx,yy=matrix(((cos(r),-sin(r)),(sin(r),cos(r))))*(xy-matrix('0;31'))+matrix('8;42')
    20				arr[int(yy)][int(xx)]='#'
    21			x=x+1
    22		y=y+1
    23	
    24	for y in range(43):
    25		for x in range(60):
    26			ch=arr[y][x]
    27			if ch != '#':ch=' '
    28			sys.stdout.write(ch)
    29		print
    30	

                                      ###### ##             
                                    ## ##########           
                                    #############           
                                   ####### ########         
                                  ## ## ###########         
                   #               #######    ## ##         
              ##########           #######      ####        
           ######## ## ####         #  #        ####        
        ##### ## ###########                     ####       
         ################ ## #                  #####       
      ########################                 #####        
     ######### ## ############                 ## ###       
   ##### ## ######    #### ####                #####        
   ############          ######             ########        
  ##########             #### #             ########        
 ########                # ####           ## ######         
### #####                 ####         ###########          
 ######                   ####      ########### ###         
######                    # ##   ######## #######           
# #####                  #### ###### ###########            
######                  ###### ############## #             
######                 # ############## ## ###              
# ## ##               ############## #######                
 ######            ######### ##############                 
 ###### #       ###### ## ##############                    
   ####### #  ## ## ############## ##                       
    ####### ################ ## ###                         
      ## ################ ######                            
        ######### ## ########                               
      ##### ## ###########                                  
      ## ##############                                     
      ########### ###                                       
     ####### #####                                          
    ## ########                                             
     #######                                                
     #### #                                                 
     #####                                                  
      ####                                                  
      ###                                                   
      # #                                                   
       #       

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA