def show_color_picture() a=make2d(50,50) for y in 0..49 for x in 0..49 a[y][x]=[0.5,(1.0-y)**2/49.0**2,(x+y)**2/(49.0*2)**2] end end show(a) end
def b(s,x,y) if distance(x,y,s/2,s/2) <= s/2 (2*s/3-distance(x,y,2*s/3,s/3))/(2*s/3) else 1.0 end end def sphere(s) image = make2d(s, s) for y in 0..(s -1) for x in 0..(s -1) image[y][x] = b(s,x,y) end end image end
# HAARウェーブレット変換によるデータの画像への隠蔽 # コピープロテクトとして用いることができる。 # 購入者のIDをwatermarkとして画像に埋め込み # 画像が流出した際にその画像からwatermarkを取り出し # 流出させた人物を特定することができる。 # robustなwatermarkにするために、周波数成分に埋め込む。 # jpeg圧縮、ガウスノイズ、回転、縮小などによりデータを失わない。 # 3level dwt, and hide watermark in HL area. # watermark = [1,0,1,0,1,0,1,0,1] def array [[ 161.798, 161.357, 160.617, 160.802, 161.83, 158.157, 158.054, 161.684 .... ]] end x,y = array[0].length,array.length new_array = make2d(x,y) array.each_with_index do |ar,j| ar.each_with_index do |a,k| new_array[j][k]=a/255 end end def dwt_yoko(array) x,y = array[0].length,array.length new_array = make2d(x,y) (x-1).times do |l| (y-1).times do |m| if l < x/2 new_array[l][m] = (array[2*l][m]+array[2*l+1][m])/2 elsif l < x-1 new_array[l][m] = (array[2*(l-x/2)][m]-array[2*(l-x/2)+1][m]+1)/2 end end end return new_array end def dwt_tate(array) x,y = array[0].length,array.length new_array = make2d(x,y) (x-1).times do |l| (y-1).times do |m| if m < y/2 new_array[l][m] = (array[l][2*m]+array[l][2*m+1])/2 elsif m < y-1 new_array[l][m] = (array[l][2*(m-y/2)]-array[l][2*(m-y/2)+1]+1)/2 end end end return new_array end def dwt(array) return dwt_tate(dwt_yoko(array)) end def idwt_yoko(array) x,y = array[0].length,array.length new_array = make2d(x,y) (x/2-1).times do |l| (y-1).times do |m| array[l+x/2][m] = 0 if !array[l+x/2][m] array[l][m] = 0 if !array[l][m] new_array[2*l-1][m] = array[l][m]+array[l+x/2][m]-1/2 new_array[2*l][m] = array[l][m]-array[l+x/2][m]+1/2 end end return new_array end def idwt_tate(array) x,y = array[0].length,array.length new_array = make2d(x,y) (x-1).times do |l| (y/2-1).times do |m| array[l][m+y/2] = 0 if !array[l][m+y/2] array[l][m] = 0 if !array[l][m] new_array[l][2*m-1] = array[l][m]+array[l][m+y/2]-1/2 new_array[l][2*m] = array[l][m]-array[l][m+y/2]+1/2 end end return new_array end def idwt(array) return idwt_yoko(idwt_tate(array)) end 3.times do |i| new_array = dwt(new_array) end data = [1,0,1,0,1,0,1,0,1] watermark = make2d(x/8,y/8) (x/8).times do |xx| (y/8).times do |yy| new_array[(7*x/8)+xx][yy]=data[(xx/(64/3)).floor*3+(yy/(64/3)).floor] end end 3.times do |i| new_array = idwt(new_array) end show(new_array)
def wave(x,y,u,v) (1+sin(distance(x,y,u,v)))*0.5 end def interference3_simple(s,a,b,c) z = make2d(2*s,2*s) for y in 0..2*s-1 for x in 0..2*s-1 z[y][x] = [wave(x,y, s*(1+cos(a)) , s*(1+sin(a)) ), wave(x,y, s*(1+cos(b)) , s*(1+sin(b)) ), wave(x,y, s*(1+cos(c)) , s*(1+sin(c)) )] end end show(z) end3波の干渉/複雑版
ha=hb=hc=1 frequencya=frequencyb=frequencyc=1 lengtha=lengthb=lengthcこれにより17あった変数を9にまで減らすことができる。
なお、添付画像は interference3_complex(200,20,50,0.4,10,10,110,140,0.6,15,24,50,190,1,24,8,18) である。
def pi 3.14159265358979323846264 #円周率 end def wave(h,t,x,y,u,v,l,f) h*(1+sin(2*pi*(distance(x,y,u,v)/l - t/f)))*0.5 end def interference3_complex(s,xa,ya,ha,lengtha,frequencya,xb,yb,hb,lengthb,frequencyb,xc,yc,hc,lengthc,frequencyc,t) z = make2d(s,s) for y in 0..s-1 for x in 0..s-1 z[y][x] = [wave(ha,t,x,y,xa,ya,lengtha,frequencya), wave(hb,t,x,y,xb,yb,lengthb,frequencyb), wave(hc,t,x,y,xc,yc,lengthc,frequencyc)] end end show(z) end
def japan(s) t=s*3/2 image=make2d(s,t) for x in 0..(s-1) for y in 0..(t-1) if distance(x,y,s/2,t/2) <= 3*s/10 image[x][y]=[1,0,0] else image[x][y]=[1,1,1] end end end image end
def random_gradient_rgb(width = 256, height = 256) canvas = make2d(height, width) rxy = rand() rxd = rand() * 2 * PI ryd = rand() * 2 * PI gxy = rand() gxd = rand() * 2 * PI gyd = rand() * 2 * PI bxy = rand() bxd = rand() * 2 * PI byd = rand() * 2 * PI for y in 0..canvas.length()-1 for x in 0..canvas[y].length()-1 r = 0.5 + (rxy * sin(x * 0.05 + rxd) + (1 - rxy) * cos(y * 0.05 + ryd)) / 2.0 g = 0.5 + (gxy * sin(x * 0.05 + gxd) + (1 - gxy) * cos(y * 0.05 + gyd)) / 2.0 b = 0.5 + (bxy * sin(x * 0.05 + bxd) + (1 - bxy) * cos(y * 0.05 + byd)) / 2.0 canvas[y][x] = [r, g, b] end end show(canvas) return [rxy, rxd, ryd, gxy, gxd, gyd, bxy, bxd, byd] end2作目「HSVグラデーション」
def hsv_to_rgb(h, s, v) h *= 360 c = v * s x = c * (1 - ((h / 60.0) % 2 - 1).abs) m = v - c r, g, b = case when h < 60 then [c, x, 0] when h < 120 then [x, c, 0] when h < 180 then [0, c, x] when h < 240 then [0, x, c] when h < 300 then [x, 0, c] else [c, 0, x] end [r, g, b].map{|channel| (channel + m)} end def random_gradient_hsv(width = 256, height = 256) canvas = make2d(height, width) hxy = rand() hxd = rand() * 2 * PI hyd = rand() * 2 * PI sxy = rand() sxd = rand() * 2 * PI syd = rand() * 2 * PI vxy = rand() vxd = rand() * 2 * PI vyd = rand() * 2 * PI for y in 0..canvas.length()-1 for x in 0..canvas[y].length()-1 h = 0.5 + (hxy * sin(x * 0.05 + hxd) + (1 - hxy) * cos(y * 0.05 + hyd)) / 2.0 s = 0.5 + (sxy * sin(x * 0.05 + sxd) + (1 - sxy) * cos(y * 0.05 + syd)) / 2.0 v = 0.5 + (vxy * sin(x * 0.05 + vxd) + (1 - vxy) * cos(y * 0.05 + vyd)) / 2.0 canvas[y][x] = hsv_to_rgb(h, s, v) end end show(canvas) return [hxy, hxd, hyd, sxy, sxd, syd, vxy, vxd, vyd] end3作目「虹
def rainbow_gradient(width = 256, height = 256) table = [[0.08777,0.00000,0.19463],中略,[0.13614,0.00000,0.00000]] canvas = make2d(height, width) for y in 0..canvas.length()-1 for x in 0..canvas[y].length()-1 p = (table.length() - 1) * (x + y) / (width + height) r = table[p.floor][0] * (1 - (p - p.floor)) + table[p.ceil][0] * (p - p.floor) g = table[p.floor][1] * (1 - (p - p.floor)) + table[p.ceil][1] * (p - p.floor) b = table[p.floor][2] * (1 - (p - p.floor)) + table[p.ceil][2] * (p - p.floor) canvas[y][x] = [r, g, b] end end show(canvas) return true end4作目「花火」
def firework(width = 256, height = 256) canvas = fill_in(make2d(height, width), [0, 0, 0, 1]) length = (rand() * [width, height].min / 2).to_i number = ((length + [width, height].min / 4) / 2).to_i table = [[0.08777,0.00000,0.19463],中略,[0.13614,0.00000,0.00000]] p = (table.length() - 1) * rand() r = table[p.floor][0] * (1 - (p - p.floor)) + table[p.ceil][0] * (p - p.floor) g = table[p.floor][1] * (1 - (p - p.floor)) + table[p.ceil][1] * (p - p.floor) b = table[p.floor][2] * (1 - (p - p.floor)) + table[p.ceil][2] * (p - p.floor) for i in 0..number max = length ** 2 angle = rand() * 2 * PI xa = cos(angle) * length / max ya = sin(angle) * length / max yb = 0.05 * height * sqrt(height / length) / length ** 4 x0 = width / 2 y0 = height / 2 for t in 0..max x = (x0 + xa * t).to_i y = (y0 + ya * t + yb * t ** 2).to_i if(y > height - 1) next end a = 1.0 * t / max canvas[y][x] = [r, g, b, a] end end show(canvas) return [length, number, [r, g, b]] end5作目「パワーアップ花火」
def firework_gradient(width = 256, height = 256) image = fill_in(make2d(height, width), 0) for k in 0..7 canvas = fill_in(make2d(height, width), [0, 0, 0, 0]) length = (rand() * [width, height].min / 2).to_i number = ((length + [width, height].min / 4) / 2).to_i table = 略 p = (table.length() - 1) * rand() r = table[p.floor][0] * (1 - (p - p.floor)) + table[p.ceil][0] * (p - p.floor) g = 略 b = 略 c = hsv_to_rgb(rgb_to_hsv(r, g, b)[0], rgb_to_hsv(r, g, b)[1], 1) r = c[0] g = c[1] b = c[2] for i in 0..number max = length ** 2 angle = rand() * 2 * PI xa = cos(angle) * length / max ya = sin(angle) * length / max yb = 0.05 * height * sqrt(height / length) / length ** 4 x0 = width / 2 y0 = height / 2 for t in 0..max x = (x0 + xa * t).to_i y = (y0 + ya * t + yb * t ** 2).to_i if(y > height - 1) next end a = 1.0 * t / max canvas[y][x] = [r, g, b, a] end end image = alpha_blend(canvas, image) end show(image) return true end6作目「空に架かる虹」
def rainbow_in_the_sky(width = 256, height = 256) table = [[0,0,0],[0.03215,0.00000,0.06704],中略,[0.07337,0.00000,0.00000],[0,0,0]] canvas = fill_in(make2d(height, width), [0, 0, 0, 0]) for y in 0..canvas.length()-1 for x in 0..canvas[y].length()-1 r = sqrt((x - width / 2.0) ** 2 + (y - height) ** 2) p = 2.0 * r / height - 1.0 if(p < 0 || p > 1) next end p = p * (table.length() - 1) r = table[p.floor][0] * (1 - (p - p.floor)) + table[p.ceil][0] * (p - p.floor) g = table[p.floor][1] * (1 - (p - p.floor)) + table[p.ceil][1] * (p - p.floor) b = table[p.floor][2] * (1 - (p - p.floor)) + table[p.ceil][2] * (p - p.floor) a = rgb_to_hsv(r, g, b)[2] if(a < 0.6) a = a ** 2 / 0.6 end if(a < 0.4) a = a ** 2 / 0.4 end if(a < 0.2) a = a ** 2 / 0.2 end canvas[y][x] = [r, g, b, a] end end show(alpha_blend(canvas, fill_in(make2d(height, width), [0.62, 0.84, 0.93, 1]))) return true end
def b(s,x,y) if distance(x,y,s/2,s/2) <= s/2 (2*s/2-distance(x,y,2*s/2,s/2))/(2*s/2) else 1.0 end end def sphere(s) image = make2d(s, s) for y in 0..(s -1) for x in 0..(s -1) if distance(x,y,s/4,s/4) <= s/2 image[y][x] = [1,1,1] else image[y][x] = [b(s,x,y), 1, 1] end end end image end
def show_color_picture() a=make2d(200,200) for y in 0..199 for x in 0..199 if (x-99)**2+(y-99)**2>2500.0 r=1.0 else r=0.0 end a[y][x]=[r,(200.0-y)/200.0,0.0] end end show(a) end
投票が済んだので画像は非公開とします.
自分が過去に作ったものの流用ですが、提出しないのももったいないと思ったので提出しておきます。r=[1,0,0] s=[1, 0.7, 0.4] b=[0.5, 0.4, 0] w=[1,1,1] mario=[[w,w,w,w,w,w,w,w,w,w,w,w,w,w], ..., [w,w,w,w,w,w,w,w,w,w,w,w,w,w]] show(mario) # 参考画像:http://ks.c.yimg.jp/res/chie-que-13110/13/110/798/618/i320
#r=600 def magatama(r) rr=r*0.4 rrr=r*0.43 sr=r*0.07 array=make2d(r,r) for i in 0..(r-1) for j in 0..(r-1) d=distance(i,j,(r-1)/2.0,(r-1)/2.0) if d>rrr array[i][j]=0 elsif rr<=d && d <= rrr array[i][j]=1 else if i<=(r-1)/2.0 if distance(i,j,0.3*r,0.5*r)<=sr array[i][j]=1 else if j>=(0.5*r)&&(rr/2.0)<=distance(i,j,0.3*r,0.5*r) array[i][j]=1 else array[i][j]=0 end end else array[i][j]=(1-array[r-1-i][r-1-j]) end end end end array end def ura(r) array=magatama(r) for i in 0..(r-1) for j in 0..(r-1) array[i][j]=1-array[i][j] end end array end def draw_bool(r) array=make2d(r,r) u=r/4 sub_array=magatama(u) for i in 0..3 for j in 0..3 for k in 0..(u-1) for m in 0..(u-1) array[i*u+k][j*u+m]=sub_array[k][m] end end end end array end def coloring(r) t=10.0 array=make2d(r,r) for i in 0..(r-1) for j in 0..(r-1) d1=distance(i,j,0,0) d2=distance(i,j,r-1,r-1) d3=distance(i,j,r-1,0) d4=distance(i,j,0,r-1) array[i][j]=[abs((sin(d1/t)+sin(d2/t))/2.0),abs((sin(d1/t)+sin(d3/t))/2.0),abs((sin(d1/t)+sin(d4/t))/2.0)] end end array end def draw(r) color=coloring(r) draw=draw_bool(r) for i in 0..(r-1) for j in 0..(r-1) if draw[i][j]==0 color[i][j]=[color[i][j][0]/8.0,color[i][j][1]/8.0,color[i][j][2]/8.0] end end end color end
def scp(k) a=make2d(k,k) for y in 0..k-1 for x in 0..k-1 a[y][x]= [x.to_f/k.to_f+(k.to_f-2.0*distance(x,y,k*0.25,k*0.75))/k.to_f+rand()*0.08-rand()*0.08, 1.0-y.to_f/k.to_f+(k.to_f-2.0*distance(x,y,k*0.25,k*0.75))/k.to_f+rand()*0.08-rand()*0.08, 1.0+(k.to_f-2.0*distance(x,y,k*0.25,k*0.75))/k.to_f+rand()*0.08-rand()*0.08] end end show(a) end
def color(b) if b == 1 [0,1,0] else [0,0,0] end end # 生きているセルは緑、死んでいるセルは黒で表示する def check(d) if d == [0,1,0] 1 else 0 end end # セルの色から生=1、死=0に戻す def lifegame(n,t) a= make2d(n, n) for y in 0..n-1 for x in 0..n-1 a[y][x]= color(0) end end for y in 1..n-2 for x in 1..n-2 a[y][x] = color((2*rand()).to_i) end end # 初期配置 while t > 0 show(a) t = t - 0.5 c= make2d(n, n) for y in 0..n-1 for x in 0..n-1 if (x == 0||x==(n-1))||(y==0||y==(n-1)) c[x][y] = color(0) else e = check(a[x-1][y-1])+check(a[x-1][y])+check(a[x-1][y+1])+check(a[x][y-1])+check(a[x][y+1])+check(a[x+1][y-1])+check(a[x+1][y])+check(a[x+1][y+1]) if check(a[x][y]) == 1 if e == 2 || e == 3 c[x][y] = color(1) else c[x][y] = color(0) end else if e == 3 c[x][y] = color(1) else c[x][y] = color(0) end end end end end a = c sleep(0.5) end # t繰り返す end
image = make2d(165,165) for y in 0..164 for x in 0..164 image[y][x]=[0.5,1,1] end end if rand(1..6) == 1 print(1) for y in 0..164 for x in 0..164 image[y][x]=[1,0,0] end end for y in 64..99 for x in 64..99 if distance(x,y,82.5,82.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[1,0,0] end end end elsif rand(2..6) == 2 print(2) for y in 30..64 for x in 30..64 if distance(x,y,47.5,47.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 100..134 for x in 100..134 if distance(x,y,117.5,117.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end elsif rand(3..6) == 3 print(3) for y in 30..64 for x in 30..64 if distance(x,y,47.5,47.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 65..99 for x in 65..99 if distance(x,y,82.5,82.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 100..134 for x in 100..134 if distance(x,y,117.5,117.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end elsif rand(4..6) == 4 print(4) for y in 30..64 for x in 30..64 if distance(x,y,47.5,47.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 100..134 for x in 30..64 if distance(x,y,47.5,117.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 30..64 for x in 100..134 if distance(x,y,117.5,47.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 100..134 for x in 100..134 if distance(x,y,117.5,117.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end elsif rand(5..6) == 5 print(5) for y in 30..64 for x in 30..64 if distance(x,y,47.5,47.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 65..99 for x in 65..99 if distance(x,y,82.5,82.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 100..134 for x in 100..134 if distance(x,y,117.5,117.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 100..134 for x in 30..64 if distance(x,y,47.5,117.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 30..64 for x in 100..134 if distance(x,y,117.5,47.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end elsif rand(6..6) == 6 print(6) for y in 25..59 for x in 30..64 if distance(x,y,47.5,42.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 65..99 for x in 30..64 if distance(x,y,47.5,82.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 105..139 for x in 30..64 if distance(x,y,47.5,122.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 25..59 for x in 100..134 if distance(x,y,117.5,42.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 65..99 for x in 100..134 if distance(x,y,117.5,82.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end for y in 105..139 for x in 100..134 if distance(x,y,117.5,122.5)<=17.5 image[y][x]=[1,1,1] else image[y][x]=[0.5,1,1] end end end end show(image)
投票が済んだので画像は非公開とします.
北斗の拳修羅の国篇パチスロ化おめでとう!プログラムは長いので添付しました。ソース自体は何の変哲も面白みもない、単なる力技の産物です。
def hkt #make base hkt = make2d(162,144) #color_definition # #background b1 = [0,150/255.0,230/255.0] b2 = [0,160/255.0,70/255.0] b3 = [80/255.0,0,40/255.0] # #common s1 = [255/255.0,226/255.0,177/255.0] #skin s2 = [235/255.0,170/255.0,85/255.0] s3 = [210/255.0,140/255.0,45/255.0] e1 = [145/255.0,88/255.0,33/255.0] #eye e2 = [200/255.0,185/255.0,158/255.0] w = [1,1,1] #white b = [0,0,0] #black # #kenshiro kh1 = [50/255.0,40/255.0,20/255.0] #hair kh2 = [6/255.0,5/255.0,4/255.0] kh3 = [110/255.0,90/255.0,50/255.0] ke1 = [0,132/255.0,147/255.0] #eye:ke1 is the same color as shachi's listband ke2 = [0,90/255.0,105/255.0] ke3 = [0,30/255.0,50/255.0] kc1 = [0,0,130/255.0] #clothes kc2 = [0,84/255.0,180/255.0] kc3 = [0,0,42/255.0] # #shachi sh1 = [1,1,212/255.0] #hair sh2 = [240/255.0,230/255.0,160/255.0] sh3 = [210/255.0,200/255.0,110/255.0] sh4 = [180/255.0,165/255.0,80/255.0] sh5 = [150/255.0,130/255.0,50/255.0] se1 = [0,185/255.0,61/255.0] #eye se2 = [0,150/255.0,49/255.0] se3 = [0,80/255.0,25/255.0] sl1 = [0,176/255.0,191/255.0] #listband sl2 = [84/255.0,231/255.0,248/255.0] #notice:sl3 is the same color as kenshiro's eye(ke1) # #kaioh kp1 = [192/255.0,0,1] #purple part kp2 = [88/255.0,0,115/255.0] ky1 = [1,243/255.0,54/255.0] #yellow part ky2 = [1,168/255.0,42/255.0] kr1 = [1,37/255.0,37/255.0] #red part kr2 = [1,177/255.0,177/255.0] kb1 = [80/255.0,80/255.0,80/255.0] #black part kb2 = [16/255.0,16/255.0,16/255.0] #show picture #chikarawaza nimo hodo ga aru hkt = [[b1,b1,b1,...,kp2], ... [b,b,b,...b]] end show (hkt)
def r(s, x, y) if distance(x, y, s/2.0, s/3.0) <= (0.9/3)*s 1 else 0 end end def g(s, x, y) if distance(x, y, s/3.0, 2*s/3) <= (0.9/3)*s 1 else 0 end end def b(s, x, y) if distance(x, y, 2*s/3.0, 2*s/3.0) <= (0.9/3)*s 1 else 0 end end def color1(s, x, y) [r(s, x, y), g(s, x, y), b(s, x, y)] end def rgb(s) image1 = make2d(s, s) for y in 0..(s-1.0) for x in 0..(s-1.0) image1[y][x] = color1(s, x, y) end end image1 end加法混色に引き続き、色の三原色による減法混色の図です。加法混色の図のコードを少し書き換えるだけで作ることができましたが、減法混色の名の通り、引き算(-1の足し算)を意識したものとなりました。添付画像はs=300としたときのものです。
def inb(s, x, y) if distance(x, y, s/2.0, s/3.0) <= (0.9/3)*s -1 else 0 end end def ing(s, x, y) if distance(x, y, s/3.0, 2*s/3) <= (0.9/3)*s -1 else 0 end end def inr(s, x, y) if distance(x, y, 2*s/3.0, 2*s/3.0) <= (0.9/3)*s -1 else 0 end end def color2(s, x, y) [1 + inr(s, x, y), 1 + ing(s, x, y), 1 + inb(s, x, y)] end def ymc(s) image2 = make2d(s, s) for y in 0..(s-1.0) for x in 0..(s-1.0) image2[y][x] = color2(s, x, y) end end image2 end
これで完成。関数show()で表示。 ただし、3つの引数は順に表示範囲の大きさ(a単位)、ボーア半径(pixel),補正値(正数)である(添付図は20,10,3)。この図は水素原子の3s軌道に対応した波動関数の二乗を濃淡で表し、正が赤、負が青。濃い場所ほど電子が存在する確率が高いらしい。なお、波動関数は構造化学の教科書より引用し、そのままだと色が薄いから対数関数で補正してある。bはその程度を指定する。
def Image (s,a,b) l=a*s*2 a = a.to_f max = 0.0 image = Array.new(l) for i in 0..(l-1) image[i] = Array.new(l) end for i in 0..(l-1) for j in 0..(l-1) r = distance(i,j,l/2,l/2).to_f v = (27-18*r/a+2*(r**2)/(a**2))*exp(-r/3/a) image[i][j] = v if v.abs > max max = v.abs end end end for i in 0..(l-1) for j in 0..(l-1) v = image[i][j] if b == 0 vv = (v.abs/max)**2 else vv = log((v.abs/max)**2*(E**b-1)+1)/b end if v >= 0.0 image[i][j] = [1,1-vv,1-vv] else image[i][j] = [1-vv,1-vv,1] end end end return image end
def color(l,x,y) s=(sin((distance(l/3.0,l/3.0,x,y)+distance(l/3.0,2*l/3.0,x,y)+distance(2*l/3.0,l/3.0,x,y)+distance(2*l/3.0,2*l/3.0,x,y)))).abs t=(cos((distance(l/3.0,l/3.0,x,y)+distance(l/3.0,2*l/3.0,x,y)+distance(2*l/3.0,l/3.0,x,y)+distance(2*l/3.0,2*l/3.0,x,y)))).abs [s*s*t*t,s*s*t,s*t*t] end def picture(l) a=make2d(l,l) for x in 0..(l-1) for y in 0..(l-1) a[x][y]=color(l,x,y) end end show(a) end
今回は正方形と円の画像を重ねると、正三角形が現れるプログラムを書いてみました。 画像を見ただけだと分からないかもしれませんが、透明なシートに1枚目と2枚目の画像を印刷して重ねると、本当に正方形と円が消えて正三角形が浮かび上がります。
def square1(n) # 黒の正方形を生成する関数。 a=make2d(10*n,10*n) for i in 3*n .. 7*n for j in 3*n .. 7*n a[i][j] = 1 end end for i in 0 .. 10*n-1 for j in 0 .. 10*n-1 a[i][j] = 1-a[i][j] end end return a end ######################################################### def round(n) # 黒の円を生成する関数。 a = make2d(10*n,10*n) s = 5*n t = 5*n for i in 0..10*n-1 for j in 0..10*n-1 if sqrt((i-s)**2+(j-t)**2) >=3*n a[i][j]=1 end end end return a end def region(x0,y0,x1,y1,x2,y2,picture) if (x1-x2)*(y0-y2)>=(x0-x2)*(y1-y2) for i in 0..picture.length()-1 for j in 0..picture[0].length()-1 if (x1-x2)*(i-y2)<(j-x2)*(y1-y2) picture[i][j]= picture[i][j]+1 end end end else for i in 0..picture.length()-1 for j in 0..picture[0].length()-1 if (x1-x2)*(i-y2)>=(j-x2)*(y1-y2) picture[i][j]= picture[i][j]+1 end end end end end ######################################################### def triangle(n) # 黒の三角形を生成する関数。絵を出力するたびに向きが変化する。 a = make2d(10*n,10*n) b = PI*rand(0.0..2.0) x0 = 5*n y0 = 5*n x1 = x0 + 3*n*cos(b) x2 = x0 + 3*n*cos(2*PI/3.0+b) x3 = x0 + 3*n*cos(4*PI/3.0+b) y1 = y0 + 3*n*sin(b) y2 = y0 + 3*n*sin(2*PI/3.0+b) y3 = y0 + 3*n*sin(4*PI/3.0+b) region(x0,y0,x1,y1,x2,y2,a) region(x0,y0,x1,y1,x3,y3,a) region(x0,y0,x2,y2,x3,y3,a) for i in 0..10*n-1 for j in 0..10*n-1 if a[i][j]>=1 a[i][j]=1 end end end return a end ######################################################### def black_white(i,j,picture,both) # 2×2のマスのうち、both=0のときは白いマスの一つをランダムに黒くするプログラム。both=1のときはさらに黒いマスの一つをランダムに白くする。 if picture[2*i+1][2*j]==1 && picture[2*i+1][2*j+1]==1 # p0で番号1のマスに対応 a = rand(0..1) b = rand(0..1) picture[2*i+1][2*j] = a picture[2*i+1][2*j+1] = 1-a picture[2*i][2*j] = both * b picture[2*i][2*j+1] = both *(1-b) else if picture[2*i][2*j]==1 && picture[2*i][2*j+1]==1 # p0で番号2のマスに対応 a = rand(0..1) b = rand(0..1) picture[2*i][2*j] = a picture[2*i][2*j+1] = 1-a picture[2*i+1][2*j] = both * b picture[2*i+1][2*j+1] = both *(1-b) else if picture[2*i][2*j+1]==1 && picture[2*i+1][2*j+1]==1 # p0で番号3のマスに対応 a = rand(0..1) b = rand(0..1) picture[2*i][2*j+1] = a picture[2*i+1][2*j+1] = 1-a picture[2*i+1][2*j] = both * b picture[2*i][2*j] = both *(1-b) else if picture[2*i][2*j]==1 && picture[2*i+1][2*j]==1 # p0で番号4のマスに対応 a = rand(0..1) b = rand(0..1) picture[2*i][2*j] = a picture[2*i+1][2*j] = 1-a picture[2*i][2*j+1] = both * b picture[2*i+1][2*j+1] = both *(1-b) else if picture[2*i][2*j+1]==1 && picture[2*i+1][2*j]==1 # p0で番号5のマスに対応 a = rand(0..1) b = rand(0..1) picture[2*i][2*j+1] = a picture[2*i+1][2*j] = 1-a picture[2*i][2*j] = both * b picture[2*i+1][2*j+1] = both *(1-b) else if picture[2*i][2*j]==1 && picture[2*i+1][2*j+1]==1 # p0で番号6のマスに対応 a = rand(0..1) b = rand(0..1) picture[2*i][2*j] = a picture[2*i+1][2*j+1] = 1-a picture[2*i+1][2*j] = both * b picture[2*i][2*j+1] = both *(1-b) end end end end end end end ######################################################### def imagecode(n) # 絵を暗号化するプログラム。nの10倍の画素数で出力される。 or1 = square1(n) # ここに重ねる前の1枚目の画像の配列を貼り付ける or2 = round(n) # ここに重ねる前の2枚目の画像の配列を貼り付ける or3 = triangle(n) # ここに重ねた後に現れる画像の配列を貼り付ける h = or1.length() # or1の縦の長さ w = or1[0].length() # or1の横の長さ or0 = make2d(h,w) # 砂嵐の元の配列を作る。1〜6の数字を代入。 for i in 0..h-1 for j in 0..w-1 or0[i][j] = rand(1..6) end end p0 = make2d(h*2,w*2) # or0を利用して砂嵐の画像を作る。 p1 = make2d(h*2,w*2) # or1に対応する画像を生成 p2 = make2d(h*2,w*2) # or2に対応する画像を生成 p3 = make2d(h*2,w*2) # or3に対応する画像を生成 # 目的の画像p0,p1,p2,p3は元の画像or0,or1,or2,or3の縦横2倍の長さである。以下、or0の[i,j]成分がp0の4つの成分[2*i][2*j],[2*i][2*j+1],[2*i+1][2*j],[2*i+1][2*j+1]に対応する。 for i in 0..h-1 # or0の配列に対応する砂嵐をp0に入力する。6種類の数字に2×2のすべてのパターンを対応させた。 for j in 0..w-1 c = or0[i][j] if c==2 || c==4 || c==6 p0[2*i][2*j]=1 end if c==2 || c==3 || c==5 p0[2*i][2*j+1]=1 end if c==1 || c==4 || c==5 p0[2*i+1][2*j]=1 end if c==1 || c==3 || c==6 p0[2*i+1][2*j+1]=1 end end end # p1にp0と同じ配列を代入。 for i in 0..2*h-1 for j in 0..2*w-1 p1[i][j]=p0[i][j] end end for i in 0..h-1 for j in 0..w-1 if or1[i][j]==0 # or1の黒いピクセルについて、p1の対応するマスに関数black_whiteを適用 black_white(i,j,p1,0) end end end for i in 0..h-1 for j in 0..w-1 if or2[i][j]==0 && or3[i][j]==0 # or2,or3の対応するピクセルが共に黒 p2[2*i][2*j] = 1 - p0[2*i][2*j] # p0の白黒を反転させてp2に代入 p2[2*i+1][2*j] = 1 - p0[2*i+1][2*j] p2[2*i][2*j+1] = 1 - p0[2*i][2*j+1] p2[2*i+1][2*j+1]= 1 - p0[2*i+1][2*j+1] black_white(i,j,p2,0) # 1つだけ黒くする else if or2[i][j]==1 && or3[i][j]==0 # or2の対応するピクセルが白,or3の対応するピクセルが黒 p2[2*i][2*j] = 1 - p0[2*i][2*j] # p0の白黒を反転させてp2に代入 p2[2*i+1][2*j] = 1 - p0[2*i+1][2*j] p2[2*i][2*j+1] = 1 - p0[2*i][2*j+1] p2[2*i+1][2*j+1]= 1 - p0[2*i+1][2*j+1] else if or1[i][j]==1 && or2[i][j]==0 && or3[i][j]==1 # or1の対応するピクセルが白、or2の対応するピクセルが黒、or3の対応するピクセルが白 p2[2*i][2*j] = p0[2*i][2*j] # p0をそのままp2に代入 p2[2*i+1][2*j] = p0[2*i+1][2*j] p2[2*i][2*j+1] = p0[2*i][2*j+1] p2[2*i+1][2*j+1]= p0[2*i+1][2*j+1] black_white(i,j,p2,0) # 1つだけ黒くする else if or1[i][j]==0 && or2[i][j]==0 && or3[i][j]==1 # or1の対応するピクセルが黒、or2の対応するピクセルが黒、or3の対応するピクセルが白 p2[2*i][2*j] = p1[2*i][2*j] # p1をそのままp2に代入 p2[2*i+1][2*j] = p1[2*i+1][2*j] p2[2*i][2*j+1] = p1[2*i][2*j+1] p2[2*i+1][2*j+1]= p1[2*i+1][2*j+1] else if or1[i][j]==1 && or2[i][j]==1 && or3[i][j]==1 # or1,or2,or3の対応するピクセルが全て白 p2[2*i][2*j] = p0[2*i][2*j] # p0をそのままp2に代入 p2[2*i+1][2*j] = p0[2*i+1][2*j] p2[2*i][2*j+1] = p0[2*i][2*j+1] p2[2*i+1][2*j+1]= p0[2*i+1][2*j+1] black_white(i,j,p2,1) # 1つだけ黒く、1つだけ白くする else if or1[i][j]==0 && or2[i][j]==1 && or3[i][j]==1 # or1の対応するピクセルが黒、or2の対応するピクセルが白、or3の対応するピクセルが白 p2[2*i][2*j] = p0[2*i][2*j] # p0をそのままp2に代入 p2[2*i+1][2*j] = p0[2*i+1][2*j] p2[2*i][2*j+1] = p0[2*i][2*j+1] p2[2*i+1][2*j+1]= p0[2*i+1][2*j+1] end end end end end end end end for i in 0..2*h-1 for j in 0..2*w-1 if p1[i][j]==1 && p2[i][j]==1 p3[i][j]=1 else p3[i][j]=0 end end end show(p1) show(p2) show(p3) end
(田中のコメント) 駒場の山口泰先生の研究室でもこのような研究をしています. http://www.graco.c.u-tokyo.ac.jp/yama-lab/index.php#prettyPhoto の「Visual cryptography」に例がありますね.
def l(x,y) if y >= (-x) + 75 || y >= x + 25 if y <= (-x) + 75.5 && y <= x + 25.5 [1,1,1] else [0.8,0.4,0] end else r = sqrt((x-25)**2 + (y-50)**2) if r <= sqrt( 2 * 25**2) if y >= 44 && x >= 22 && x <= 28 [1,1,1] else [0.3,0.1,0] end else if r >= 50 [0,0,0.5] else [0,0.7,0] end end end end def ground() image = make2d(50,50) for y in 0..49 for x in 0..49 image[y][x] = l(x,y) end end image end
def show_color_picture() a=make2d(100,100) for x in 0..99 for y in 0..99 if distance(x,y,50,50)%2==0 a[y][x]=[0,1.0,0] else if (distance(x,y,50,50)%2!=0) && (distance(x,y,50,50)%3==0) a[y][x]=[0,0,1.0] else if (distance(x,y,50,50)%2!=0) && (distance(x,y,50,50)%3!=0) && (distance(x,y,50,50)%5==0) a[y][x]=[0,0,0] else if (distance(x,y,50,50)%2!=0) && (distance(x,y,50,50)%3!=0) && (distance(x,y,50,50)%5!=0) && (distance(x,y,50,50)%7==0) a[y][x]=[1.0,0,0] else a[y][x]=[0.5,0.5,0.5] end end end end end end show(a) end
def circlewave() a=make2d(501,501) for y in 0..500 for x in 0..500 a[y][x]=[0,0,(cos(distance(250,250,y,x)/10.0)/(1.1**(distance(250,250,y,x)/10.0)))+0.5] end end a end二枚目です。
def circlewave() a=make2d(501,501) for y in 0..500 for x in 0..500 a[y][x]=[(-1*(cos(distance(250,250,y,x)/10.0)/(1.1**(distance(250,250,y,x)/10.0)))+0.5),0,(cos(distance(250,250,y,x)/10.0)/(1.1**(distance(250,250,y,x)/10.0)))+0.5] end end a end
def fish() image=make2d(100,100) for y in 0..99 for x in 0..99 image[y][x]=[0,cos(y)+sin(x),sin(y)+cos(x)] end end show(image) end
# coding: utf-8 def show_picture(n) a = make2d(n,n) n = n.to_f for y in 0 .. n-1 for x in 0 .. n-1 a[y][x]=[sin(x*PI/n)*(0.8+rand()/5), cos(y*PI/n)*(0.8+rand()/5) ,cos(x*PI/n)*sin(y*PI/n)] end end show(a) end<その2> それぞれハーマングリッド、きらめき格子と呼ばれる錯視図形を作成した。 ハーマングリッドは白線の交わる部分が黒く、きらめき格子は格子点の部分の白い円が黒く見えるというもの。 掲示板の画像の大きさだとちょっとわかりにくいかもしれない。
きらめき格子は円を描く部分の処理にやや時間がかかってしまうが、個人的にはこちらの方がより目が「騙されている」感じがする。
# coding: utf-8 def hermann() a = make2d(1000,1000) for x in 0 .. 999 for y in 0 .. 999 a[x][y] = [0, 0, 0] #一度全て黒と設定する for n in 1 .. 9 if x < (n * 100) + 5 && x > (n * 100) - 5 a[x][y] = [1, 1, 1] elsif y < (n * 100)+5 && y > (n * 100) - 5 a[x][y] = [1, 1, 1] end end #格子状に白線を引いた end end show(a) end def kirameki() a = make2d(1000,1000) for x in 0 .. 999 for y in 0 .. 999 a[x][y] = [0, 0, 0] #一度全て黒と設定する for n in 1 .. 9 if x < (n * 100) + 5 && x > (n * 100) - 5 a[x][y] = [0.5, 0.5, 0.5] elsif y < (n * 100)+5 && y > (n * 100) - 5 a[x][y] = [0.5, 0.5, 0.5] end end #格子状に灰色の線を引いた for s in 1 .. 9 for t in 1 .. 9 if (x-(s*100)) ** 2 + (y-(t*100)) ** 2 < 50 a[x][y] = [1, 1, 1] end end end #各格子点に白い点を配置 end end show(a) endさきほど思いつきで書いたことをやってみた。 nが画像の大きさ、rが「ランダム度合」で、rは1から100までの間で指定する。 例によって r= 1000 などいい加減な値を代入しても出力はしてくれるが... 画像はn=500, r=75のときのもの。 rをいじって遊ぶとそれなりに楽しめる。
# coding: utf-8 def show_picture(n,r) a = make2d(n,n) n = n.to_f r = r.to_f r = r / 100 for y in 0 .. n-1 for x in 0 .. n-1 a[y][x]=[sin(x*PI/n)*((1-r)+rand()*r), cos(y*PI/n)*(1-r+rand()*r) ,cos(x*PI/n)*sin(y*PI/n)] end end show(a) end
def p(s,x,y) if 2*(y-s/4.0-75)/3.0>=-(4.8*((x-3*s/10.0)**3)/(10**5)-8.4*((x-3*s/10.0)**2) /(10**19)+55*(x-3*s/10.0)/100) && 2*(y-s/4.0-75)/3.0>=4.8*((x-7*s/10.0)**3)/(10**5)-8.4*((x-7*s/10.0)**2) /(10**19)+55*(x-7*s/10.0)/100 && y-75<=180*s/400.0 && (!(y-s/2.0-75>=-(x-130*s/400.0) && y-s/2.0-75>=x-270*s/400.0)) 1.0-(((distance(x,y,s/2.0,s/2.0+75))%45)/45) else if (distance(x,y,127*s/400.0,227*s/400.0+75)<=89*s/400.0 || distance(x,y,273*s/400.0,227*s/400.0+75)<=89*s/400.0) && (!(y-s/2.0-75<=x-130*s/400.0 && y-s/2.0-75<=-(x-270*s/400.0) && y-s/2.0-75>=-(x-130*s/400.0) && y-s/2.0-75>=x-270*s/400.0)) 1.0-(((distance(x,y,s/2.0,s/2.0+75))%45)/45) else if y-227*s/400.0-75>=-(4*(x-s/2.0)) && y-227*s/400.0-75>=4*(x-s/2.0) && (y-334*s/400.0-75)**2>=(1.0-(x-157*s/400.0)**2/36**2)*66**2 && (y-334*s/400.0-75)**2>=(1.0-(x-243*s/400.0)**2/36**2)*66**2 && y<=s+75 && (!(y-s/2.0-75<=x-130*s/400.0 && y-s/2.0-75<=-(x-270*s/400.0))) 1.0-(((distance(x,y,s/2.0,s/2.0+75))%45)/45) else if y-s/2.0-75<=x-130*s/400.0 && y-s/2.0-75<=-(x-270*s/400.0) && y-s/2.0-75>=-(x-130*s/400.0) && y-s/2.0-75>=x-270*s/400.0 1.0-(((distance(x,y,s/2.0,s/2.0+75))%21)/21) else 0 end end end end end def kadai(s) image = make2d(s+150,s) for y in 0..(s+149) for x in 0..(s-1) image[y][x] = [11*p(s,x,y)/14.0,0,0] end end image end def kadai14 kadai14 = kadai(400) end
def wave4corner(s) image = make2d(s,s) for y in 0..(s-1) for x in 0..(s-1) image[y][x] = 0.25*((sin(distance(0,0,x,y)))+(sin(distance(s,s,x,y)))+sin(distance(s,0,x,y))+sin(distance(0,s,x,y))).abs end end image end
中心からの距離、rの設定は、yとxを繰り返しで指定行ってから、書かないといけないというところがわからず苦労しました。また、ifの設定も数式をどう作っていいかわからず、苦労しましたが、昨年度のプログラムを参考にした結果、除数のあまりを使えばいいという発想に至りました。
また、ファイル名、プログラム名がhomework2となっていますが、これは一つ目を作り始めたあとに、また違ったものを作ろうと思い、完成したものだからです。一つ目の作品は三角関数を使用して作ろうとしましたが、あまりうまく行かなかったため、今回は投稿していません。また時間があったら作り直して、投稿しようと思います。関数を用いたものを作ってみたいです。
def homework2() a=make2d(200,220) for y in 0..199 for x in 0..219 r=distance(y,x,99,109) if r>70 if y%10>4 if x%50>24 a[y][x]=[1,1,1] else a[y][x]=[0,0,0] end else if x%50>24 a[y][x]=[0,0,0] else a[y][x]=[1,1,1] end end else if x%10>4 if y%50>24 a[y][x]=[0,0,0] else a[y][x]=[1,1,1] end else if y%50>24 a[y][x]=[1,1,1] else a[y][x]=[0,0,0] end end end end end show(a) end
def ichimatsu(s) image=make2d(s,s) for y in 0..s-1 for x in 0..s-1 image[y][x]=a(x,y) end end image end def a(x,y) if (x+y)%2 ==0 1 else 0 end end黒と白の縦ラインを作ってみた。
def linear(s) image=make2d(s,s) for y in 0..s-1 for x in 0..s-1 image[y][x]=sin(x/4.0) end end image endレーザービームー
def a(x,y) if x >= y y*1.0 / x*1.0 else x*1.0 / y*1.0 end end def color(s) image=make2d(s,s) for y in 0..s-1 for x in 0..s-1 image[y][x] = [a(x,y) ,1.0-a(x,y), (x+y)*0.5/(s-1)] end end image end
def hana(s) image = make2d(s,s) for y in 0..s-1 for x in 0..s-1 col = (((x-s/2.0)**2+(y-s/2.0)**2)**0.5 - s/2*sin(5*asin((x-s/2.0)/((x-s/2.0)**2+(y-s/2.0)**2)**0.5)))/s image[y][x]=[((sin(8*col))**2)**0.5, 0.8 , ((cos(16*col))**2)**0.5] end end image end
ソースコードは添付しました(添付画像ではn=20,l=1000としています)。
def colorcircle(n,l) a=make2d(l+1,l+1) # 座標の配列作成とRGB値入力の準備 for i in 0..l for j in 0..l a[i][j]=[0, 0, 0] end end for color in 0..2 # RGB値をR,G,Bの順でそれぞれ入力する for k in 0..n-1 # 小さな円の中心Pの位相をずらしていく px=(l/2+l/4*cos(2*PI*k/n+2*PI/3*color)).to_i # (l/2,l/2) は大きい円の中心、P(px,py) は小さい円の中心 # R,G,Bでそれぞれ2*PI/3ごと位相をずらす py=(l/2+l/4*sin(2*PI*k/n+2*PI/3*color)).to_i for i in -l/4..l/4 # 小さい円の半径をl/4とする for j in -(sqrt(l**2/16-i**2)).to_i..(sqrt(l**2/16-i**2)).to_i # 円の内部のみ処理 a[px+i][py+j][color]+=(l/2-sqrt(sqrt((px+i-l/2)**2+(py+i-l/2)**2)))/(l/2)*((k-n/2)/(n/2)).abs/n*2.5 # 大きい円の中心からの距離とPの位相に応じてRGB値を end end end end show(a) # 画像を表示 end
def a(s,x,y) if x>(2.0/3.0)*y && distance(x,y,s,(3.0/2.0)*s)>s/2.0 [0.9-0.1*(2.0*y-3.0*x)/(6.0*s),0.9-0.1*(2.0*y-3.0*x)/(6.0*s),0.85-0.15*(2.0*y-3.0*x)/(6.0*s)] elsif distance(x,y,s,(3.0/2.0)*s)>s/2.0 [0.9-0.9*(2.0*y-3.0*x)/(6.0*s),0.9-0.4*(2.0*y-3.0*x)/(6.0*s),0.85-0.6*(2.0*y-3.0*x)/(6.0*s)] elsif x>(2.0/3.0)*y [1,0,0] else [1,(2.0*y-3.0*x)/(6.0*s),(2.0*y-3.0*x)/(6.0*s)] end end def Flag_Japan_Bangladesh(s) image = make2d(2*s,3*s) for x in 0..(2*s-1) for y in 0..(3*s-1) image[x][y] = a(s,x,y) end end image end
def picture() a=make2d(512,512) for y in 0..511 for x in 0..511 t= if x+y>511 7*tan(x+y) else 2/sin(x+y) end s= if x>y 7*tan(x+y) else 2/sin(x+y) end a[x][y]=[t-s,tan(x*y*0.2),s+t] end end show(a) end
def picture_distance(k) a=make2d(k,k) for y in 0..k-1 for x in 0..k-1 r=distance(0,0,x,y)/(x**(0.5)+y**(0.5)) a[y][x]=[cos(r)%1.0,sin(r)%1.0,tan(r)%1.0] end end show(a) end
def color_distort02(size) picture = make2d(size,size) center = size/2.0 def arg(x,y,c) angle = acos((x-c)/distance(x,y,c,c))/(2*PI) if y < c then angle else 1 - angle end end def gap02(x,y,c) c / distance(x,y,c,c) end for y in 0 .. size-1 for x in 0 .. size-1 r = distance(x,y,center,center) theta = arg(x,y,center) e = gap02(x,y,center) picture[y][x] = [cos(2*PI*theta + e/100) + e,cos(2*PI*(1/6.0 + theta) + e/100) + e,cos(2*PI*(1/3.0 + theta) + e) + e/100] end end picture end
色は適当に目と口と足回り用に2色とそれ以外用に10色Illustratorのカラーパッドから緑系統の色選び、RGBで表した。 それを、列ベクトルに格納し、randを用いて色がランダムに現れるようにした。
そして、for文を用いて中身が空の8×26の行列を作り、for文を用いてランダムな色をそれぞれの要素に格納した。 その後、目、口に個別に色を書き換え、足の部分に剰余とfor文を用いて色を書き換えた。
a = [203.0/255, 217.0/255, 195.0/255] b = [112.0/255, 137.0/255, 109.0/255] c = [52.0/255, 122.0/255, 56.0/255] d = [186.0/255, 204.0/255, 183.0/255] e = [15.0/255, 107.0/255, 55.0/255] f = [98.0/255, 167.0/255, 87.0/255] g = [214.0/255, 219.0/255, 215.0/255] h = [81.0/255, 135.0/255, 82.0/255] i = [143.0/255, 201.0/255, 133.0/255] j = [78.0/255, 93.0/255, 74.0/255] k = [0.0/255, 0.0/255, 0.0/255] l = [34.0/255, 59.0/255, 30.0/255] color = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] color[0] = a color[1] = b color[2] = c color[3] = d color[4] = e color[5] = f color[6] = g color[7] = h color[8] = i color[9] = j color[rand(0..9)] creeper = Array.new(26) for i in 0..25 do creeper[i] = Array.new(8) end for i in 0..25 do for j in 0..7 do creeper[i][j] = color[rand(0..9)] end end creeper[3][2] = k creeper[3][5] = k creeper[2][1] = l creeper[3][1] = l creeper[2][2] = l creeper[2][5] = l creeper[2][6] = l creeper[3][6] = l #eyes creeper[6][2] = k creeper[5][3] = k creeper[6][3] = k creeper[5][4] = k creeper[6][4] = k creeper[6][5] = k creeper[5][2] = l creeper[7][2] = l creeper[4][3] = l creeper[4][4] = l creeper[5][5] = l creeper[7][5] = l #mouth for i in 0..7 do if i % 2 == 0 creeper[24][i] = l creeper[25][i] = k else creeper[24][i] = k creeper[25][i] = l end end #feet show(creeper)初めに定義したRGBを入れ替えて、緑系統のクリーパーだけでなく他の色のバージョンについても作ってみた。
ここでは、その一例として赤系統のものをあげた。
画像として小さくなってしまうことを考慮していなかったのは失敗だった。
a = [217.0/255, 203.0/255, 195.0/255] b = [137.0/255, 112.0/255, 109.0/255] c = [122.0/255, 52.0/255, 56.0/255] d = [204.0/255, 186.0/255, 183.0/255] e = [107.0/255, 15.0/255, 55.0/255] f = [167.0/255, 98.0/255, 87.0/255] g = [219.0/255, 214.0/255, 215.0/255] h = [135.0/255, 81.0/255, 82.0/255] i = [201.0/255, 143.0/255, 133.0/255] j = [93.0/255, 78.0/255, 74.0/255] k = [0.0/255,0.0/255, 0.0/255] l = [59.0/255, 34.0/255, 30.0/255] color = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] color[0] = a color[1] = b color[2] = c color[3] = d color[4] = e color[5] = f color[6] = g color[7] = h color[8] = i color[9] = j color[rand(0..9)] creeper = Array.new(26) for i in 0..25 do creeper[i] = Array.new(8) end for i in 0..25 do for j in 0..7 do creeper[i][j] = color[rand(0..9)] end end creeper[3][2] = k creeper[3][5] = k creeper[2][1] = l creeper[3][1] = l creeper[2][2] = l creeper[2][5] = l creeper[2][6] = l creeper[3][6] = l #eyes creeper[6][2] = k creeper[5][3] = k creeper[6][3] = k creeper[5][4] = k creeper[6][4] = k creeper[6][5] = k creeper[5][2] = l creeper[7][2] = l creeper[4][3] = l creeper[4][4] = l creeper[5][5] = l creeper[7][5] = l #mouth for i in 0..7 do if i % 2 == 0 creeper[24][i] = l creeper[25][i] = k else creeper[24][i] = k creeper[25][i] = l end end #feet show(creeper)
def picture_a(s,k) image=make2d(s,s) for x in (0..s-1) for y in (0..s-1) for i in (1..k) if y>=s*(sin(20*PI*x/s))/20+i*(s-1)/(k+1)-s/75 && y<=s*(sin(20*PI*x/s))/20+i*(s-1)/(k+1)+s/75 image[y][x]=[1,1,1] elsif y>=s*(sin(20*PI*x/s))/20+i*(s-1)/(k+1)+s/75 && y<=s*(sin(20*PI*x/s))/20+(i+1)*(s-1)/(k+1)-s/75 u=1.000000*i/(k+1) v=1.000000*x*i/((k+1)*s) image[y][x]=[v,1-u,0.5] end end if y>=s*(sin(20*PI*x/s))/20+k*(s-1)/(k+1)+s/75 image[y][x]=[1.000000*x/s,0,0.5] end if y<=s*(sin(20*PI*x/s))/20+(s-1)/(k+1)-s/75 image[y][x]=[1.000000*x/((k+1)*s),1,0.5] end end end image end
def rainbow() a=make2d(50,50) for y in 0..49 for x in 0..49 a[y][x]=[y/49.0,x/49.0,1-x/49.0] end end show(a) end
def color_picture() a=make2d(512,512) for y in 0 .. 511 for x in 0 .. 511 a[y][x]=[sin(x*PI/256)*sin(y*PI/256),cos(x*PI/256)*sin(y*PI/256),tan((x*PI/256)*(y*PI/256))] end end show(a) end
def r(x,y) sqrt((x-250)**2+(y-250)**2) end def radify(x,y) if (y-250)>0 acos((x-250)/r(x,y)) else if y==250 if x>=250 0 else PI end else 2*PI-acos((x-250)/r(x,y)) end end end def logarithmic(x,y) a=0 while r(x,y)>exp((radify(x,y)+2*a*PI)*0.3063) a=a+1 end if r(x,y)<(exp((radify(x,y)+2*a*PI)*0.3063)+exp((radify(x,y)+2*(a-1)*PI)*0.3063))/2 b=0 while 2*r(x,y)*cos(PI/3)/(exp(((2*(b+1)*PI)/(3+2*a)+2*a*PI)*0.3063)+exp(((2*(b+1)*PI)/(3+2*a)+2*(a-1)*PI)*0.3063))>1 b=b+1 end while radify(x,y)>(2*(b+1)*PI)/(3+2*a)+PI/3-acos(2*r(x,y)*cos(PI/3)/(exp(((2*(b+1)*PI)/(3+2*a)+2*a*PI)*0.3063)+exp(((2*(b+1)*PI)/(3+2*a)+2*(a-1)*PI)*0.3063))) b=b+1 end c=((4*b*PI/(3.0+2*a)+2*a*PI)-radify(x,y))**3/25000.0 [1,c,c] else d=(radify(x,y)+2*a*PI)/50.0 [1,0.3+2*d,d] end end def scp() image=make2d(500,500) for x in 0..499 for y in 0..499 image[y][x]=logarithmic((607-y),(590-x)) end end image end
def show_color_picture(n) a=make2d(n,n) for y in 0..n-1 for x in 0..n-1 a[y][x]=[sin(x+tan(x**2)).abs,sin(log(cos(y**2).abs+1)),2*asin((x-y)/(n-1)).abs/PI] end end show(a) end