*ビットマップギャラリー 平面に横と縦方向に色のついた点(ピクセル)を敷き詰めたのがビットマップです。 画像ファイルとしては,簡単なヘッダーと3バイト(1色1バイト)ずつのアスキーコードを 詰め込んでやるだけで作れて,それを PNG や JPEG に圧縮する道具もネットに転がって いるので,ちょっとしたプログラミングで華麗な画像の世界を作ることができます。 という能書きはこれくらいにして,下のURLをご覧ください。 http://www.cs.kyoto-wu.ac.jp/~konami/Semi-34/BITMAP/bmapgallery.html これらはいずれも2,30行のプログラムで描かれています。アルゴリズムも単純。まだ まだ追加予定です。 下はプログラムのソース例と解説 http://www.cs.kyoto-wu.ac.jp/~konami/Semi-34/BITMAP/bitmap.html ビットマップ画像のフォーマットの解説のレジュメ http://www.cs.kyoto-wu.ac.jp/~konami/Semi-34/BITMAP/bitmap.pdf COLOR(#fe891c){懐かしい色具合?ですね。東野圭吾氏の「白夜行」を読んでいるのですが,この小説には昔懐かしいコンピュータがぞろぞろ出てくるので頭の中でシンクロしてしまいました。bitmapは文字通りbitのmapなんだと思っていたんだけど、rubyも気になるしなあ。ベジェ曲線も(何故か話題が重なるときは重なりますねえ)気になる。悶々としますねえ。} ---- 双曲線を使ったパターンも簡単です。不等式で座標平面の範囲を決める問題なんてのも,こういうふうに美しい作品を作るのに使えるとなれば,うれしくなりますね。 #ref(hyp2.png,left) #ref(hyp4.png,right) ちなみに右下の画像を生成するための Ruby のソースはこんなものです。 px = 240; py = 180 mx = px / 2; my = py / 2 q1 = 200; q2 = 1000 colmax = 0xff colmaxh = 0xff / 2 printf("P6\n%d %d\n%d\n",px,py,colmax) for i in 0 ... py for j in 0 ... px if (j - mx) ** 2 - (i - my) ** 2 > q2 cr = 0 cg = colmaxh cb = colmax elsif (j - mx) ** 2 - (i - my) ** 2 < -q1 cb = 0 cg = colmax cr = 0 else cb = 0 cg = colmax cr = colmax end printf("%c%c%c",cr,cg,cb) end end COLOR(#fe891c){240ピクセル×180ピクセルのサイズの絵を描くってことですね} COLOR(#fe891c){で、その中央のピクセルの場所をサイズを変えても対応できるように決めておくんですね。でもどう使うのだろうか?・・・原点の位置を中央にするんだな?} COLOR(#fe891c){q1,q2って・・・うーんこれはなんだろう} COLOR(#fe891c){カラーのマックス?そしてその半分も何だろう} COLOR(#fe891c){printfってファイルに書き込む設定かな?いや違うなあ,ビットマップファイルにビットマップの「サイズと色の深さ」をヘッダとして書き込んでいるんだなきっと} COLOR(#fe891c){で、あとは、座標をfor....nextでくるくる回して、} x^2-y^2=q COLOR(#fe891c){で色分けかあ。そこで,原点の設定や,双曲線の2種類の設定q1,q2が出てくるんだ。} COLOR(#fe891c){それにしてもprintfって見ても分からないですよね。画面かファイルかとにかくプログラムの外部?に書き出しているんでしょうね。} COLOR(#006789){C,Perl,Ruby 系のprintf とか,Fortran の FORMAT 文とか,プログラミングの取っ掛かりでいちばん引っかかることですねえ。実際に使う段になると必要不可欠なものであることが分かるのですが,書式を表現するために抽象的な記号のかたまりになってしまうのが,難解さの原因。次のほうがわかりやすいかも。Ruby は同じ処理をいろいろなやりかたで実現できるという特徴があります。} printf("P6\n%d %d\n%d\n",px,py,colmax) の代わりに print "P6\n" print px, " ", py, "\n" print colmax, "\n" printf("%c%c%c",cr,cg,cb) の代わりに print cr.chr, cg.chr, cb.chr COLOR(#fe891c){そっかあ。rubyのprintfって(他のもそうなのかな?)次のformatでprintっていう命令なんだなあ。あとはP6の意味と\nの意味が分かればよいわけですね。%dはデータ(数値)の形式で、%cはchar(文字列)の形式でってことですね。} COLOR(#006789){ご明察のとおり printf は書式(format)付きプリントです。Fortran の場合には,WRITE 文と FORMAT 文との組み合わせになります(F77以降では WRITE 文の中に書式を記述できるようにはなりましたが)。P'''n''' は非圧縮ビットマップファイルであることを示す識別記号で,'''n'''=1,2,3,4,5,6 のそれぞれが,モノクロだとかグレイスケールだとかカラーだとか,テキストファイルかバイナリファイルかという方式に対応しています。で,"\n" は改行記号です。ふつうに何かを書くときには,改行なんてものを意識しないでやってますが,印刷とは何か,文章による表現とは何かということを意識しだすと,改行というのは重要なものですよね。BASIC はデフォルトで PRINT された文字列の後に改行を入れてしまう仕様ですが,あまりよくないと思います。} COLOR(#fe891c){というわけで遅まきながら遊んでみました。} #ref(bitmap.png,left) #ref(bitmapmt01.png,)