int row = 256; //rowとclnをいじる。rowは1024の約数にする
int cln = 8;
int ma = new int[row][cln];
int mb = new int[cln][cln];
int mc = new int[cln][row];
int mp = new int[row][row];
float cell_size;
int repeat = 1;
int mass_cell_size;
boolean sym = true;
void setup(){
size(1024,1024);
noStroke();
cell_size = height/row/repeat;
mass_cell_size = height/repeat;
}
void draw(){
ma = ziguzagu_mtx(ma);
mb = initialize_mtx(mb);
mc = trMtx(ma);
mp = multMtx(multMtx(ma,trMtx(mb)),mc);
draw_p(mp,0,0,color(0),color(255));
noLoop();
}
int ziguzagu_mtx(int m){
m = new int[m.length][m[0].length];//0で初期化
for(int i=0;i<row;i++){
int z;
if(int(i/cln)%2 == 0){
z = i% cln;
}else{
z = cln-(i%cln)-1;
}
m[i][z] = 1;
}
return m;
}
void keyPressed(){
if(keyCode==ENTER){
save(fname);
PGraphics pg = createGraphics(width,height);
pg.beginDraw();
pg.tint(0,0);
PImage img = loadImage(fname);
img.loadPixels();
for(int j=0;j<width;j++){
for(int k=0;k<height;k++){
int c = img.get(j,k);
if(!compare_color(c,color(0))){
pg.fill(c);
pg.stroke(c);
pg.square(j,k,1);
}
}
}
pg.endDraw();
pg.save("trans"+fname);
}
if(key=='n'){
loop();
}
if(key=='s'){
sym = sym ? false : true;
}
}
boolean compare_color(int a,int b){
return (red(a)==red(b) && green(a)==green(b) && blue(a)==blue(b));
}
void print_mtx(int m) {
for(int i=0;i<m.length;i++){
for(int j=0;j<m[0].length;j++){
print(m[i][j]);
}
println("");
}
}
int initialize_mtx(int m){
for(int i=0;i<m.length;i++){
for(int j=0;j<m[0].length;j++){
m[i][j] = round(random(0,1));
}
}
if(sym){
for(int i=0;i<m.length;i++){
for(int j=0;j<m[0].length;j++){
m[j][i] = m[i][j];
}
}
}
return m;
}
void draw_p(int m,float sx,float sy,color c1,color c2){
float y = sy;
for(int i =0;i<m.length;i++){
float x = sx;
for(int j = 0; j < m[0].length;j++){
if(m[i][j] == 0){
fill(c1);
}else{
fill(c2);
}
square(x,y,cell_size);
x += cell_size;
}
y += cell_size;
}
}
//転置行列
int trMtx(int a){
int b = new int[a[0].length][a.length];
for(int i=0;i<a.length;i++){
for(int j=0;j<a[0].length;j++){
b[j][i] = a[i][j];
}
}
return b;
}
//行列の掛け算
int multMtx(int a,int b){
int c = new int[a.length][b[0].length];
for(int i=0;i<a.length;i++){
for(int j=0;j<b[0].length;j++){
int sum=0;
for(int k=0;k<b.length;k++){
sum += a[i][k] * b[k][j];
}
c[i][j] = sum;
}
}
return c;
}