ビットマップギャラリー

平面に横と縦方向に色のついた点(ピクセル)を敷き詰めたのがビットマップです。 画像ファイルとしては,簡単なヘッダーと3バイト(1色1バイト)ずつのアスキーコードを 詰め込んでやるだけで作れて,それを PNG や JPEG に圧縮する道具もネットに転がって いるので,ちょっとしたプログラミングで華麗な画像の世界を作ることができます。 という能書きはこれくらいにして,下のURLをご覧ください。

http://www.cs.kyoto-wu.ac.jp/~konami/Semi-34/bmapgallery.html

これらはいずれも2,30行のプログラムで描かれています。アルゴリズムも単純。まだ まだ追加予定です。

下はプログラムのソース例と解説

http://www.cs.kyoto-wu.ac.jp/~konami/Semi-34/bitmap.html

ビットマップ画像のフォーマットの解説のレジュメ

http://www.cs.kyoto-wu.ac.jp/~konami/Semi-34/bitmap.pdf

懐かしい色具合?ですね。東野圭吾氏の「白夜行」を読んでいるのですが,この小説には昔懐かしいコンピュータがぞろぞろ出てくるので頭の中でシンクロしてしまいました。bitmapは文字通りbitのmapなんだと思っていたんだけど、rubyも気になるしなあ。ベジェ曲線も(何故か話題が重なるときは重なりますねえ)気になる。悶々としますねえ。


双曲線を使ったパターンも簡単です。不等式で座標平面の範囲を決める問題なんてのも,こういうふうに美しい作品を作るのに使えるとなれば,うれしくなりますね。

hyp2.png
hyp4.png

ちなみに右下の画像を生成するための 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

240ピクセル×180ピクセルのサイズの絵を描くってことですね で、その中央のピクセルの場所をサイズを変えても対応できるように決めておくんですね。でもどう使うのだろうか?・・・原点の位置を中央にするんだな? q1,q2って・・・うーんこれはなんだろう カラーのマックス?そしてその半分も何だろう

printfってファイルに書き込む設定かな?いや違うなあ,ビットマップファイルにビットマップの「サイズと色の深さ」をヘッダとして書き込んでいるんだなきっと

で、あとは、座標をfor....nextでくるくる回して、

x^2-y^2=q

で色分けかあ。そこで,原点の設定や,双曲線の2種類の設定q1,q2が出てくるんだ。 それにしてもprintfって見ても分からないですよね。画面かファイルかとにかくプログラムの外部?に書き出しているんでしょうね。

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

そっかあ。rubyのprintfって(他のもそうなのかな?)次のformatでprintっていう命令なんだなあ。あとはP6の意味と\nの意味が分かればよいわけですね。%dはデータ(数値)の形式で、%cはchar(文字列)の形式でってことですね。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS