アニメ『弱虫ペダル』
今年は第三期も始まったアニメです。ペダルの回し方とっても大事です。
では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
###### ##
## ##########
#############
####### ########
## ## ###########
# ####### ## ##
########## ####### ####
######## ## #### # # ####
##### ## ########### ####
################ ## # #####
######################## #####
######### ## ############ ## ###
##### ## ###### #### #### #####
############ ###### ########
########## #### # ########
######## # #### ## ######
### ##### #### ###########
###### #### ########### ###
###### # ## ######## #######
# ##### #### ###### ###########
###### ###### ############## #
###### # ############## ## ###
# ## ## ############## #######
###### ######### ##############
###### # ###### ## ##############
####### # ## ## ############## ##
####### ################ ## ###
## ################ ######
######### ## ########
##### ## ###########
## ##############
########### ###
####### #####
## ########
#######
#### #
#####
####
###
# #
#


コメント