ビットマップギャラリー

平面に横と縦方向に色のついた点(ピクセル)を敷き詰めたのがビットマップです。 画像ファイルとしては,簡単なヘッダーと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

懐かしい色具合?ですね。東野圭吾氏の「白夜行」を読んでいるのですが,この小説には昔懐かしいコンピュータがぞろぞろ出てくるので頭の中でシンクロしてしまいました。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(文字列)の形式でってことですね。

ご明察のとおり printf は書式(format)付きプリントです。Fortran の場合には,WRITE 文と FORMAT 文との組み合わせになります(F77以降では WRITE 文の中に書式を記述できるようにはなりましたが)。Pn は非圧縮ビットマップファイルであることを示す識別記号で,n=1,2,3,4,5,6 のそれぞれが,モノクロだとかグレイスケールだとかカラーだとか,テキストファイルかバイナリファイルかという方式に対応しています。で,"\n" は改行記号です。ふつうに何かを書くときには,改行なんてものを意識しないでやってますが,印刷とは何か,文章による表現とは何かということを意識しだすと,改行というのは重要なものですよね。BASIC はデフォルトで PRINT された文字列の後に改行を入れてしまう仕様ですが,あまりよくないと思います。

というわけで遅まきながら遊んでみました。

bitmap.png
bitmapmt01.png

うーん,これは・・・ まるで花茣蓙のような。途中でカオスに転移するのかしらん。 カオスやフラクタルとは違いますです。上のはもう忘れましたが,下のは,RGBをそれぞれ,x^2,x*y,x^2で決めたものです。ただし,値が大きくなると困ります?からそこは剰余系で処理した?かなあ。たぶんそんなのです。


添付ファイル: filebitmapmt01.png 407件 [詳細] filebitmap.png 455件 [詳細] filehyp2.png 335件 [詳細] filehyp4.png 452件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2004-03-18 (木) 17:35:49 (6678d)