gl.processing進捗

hsb形式での色の指定のサポートとpixelsを作成するための便利な関数の作成。
そろそろモジュールの階層関係や関数の定義位置などを見直した方が良いかもしれない。

手軽にpixelsを作成する関数を作成

pixels-generator。
こういうものが簡単に作れるようになるとやる気が出てくると思う。たぶん。

code
(extend gl.processing)

(define draw (draw$ (^ () (gl-draw-pixels 200 200 GL_RGB GL_UNSIGNED_BYTE pixels))
                    :save "foo.png"))

(define pixels
  (pixels-generator 200 200 (^ (i j) (values 0 i j))
                    :type :rgb))

(define main (setup$ (^ ()
                        (window 200 200 "f00" 100 100)
                        (gl-pixel-store GL_UNPACK_ALIGNMENT 1))
                     :draw draw))

rgb->hsb,hsb->rgbを作成

面倒なので、HSBについては他のサイトから引用。
hsbについて(http://homepage.mac.com/tmotoike/Lectures/GraphicsProgramming/color2.html)

HSB表色系

RGB表色系は,機器で色を指定するときには便利ですが,人間の感覚とは異なるために,感覚に合わせた色の調整に不向きなところがあります.たとえば,この色をもう少し淡く/濃くしたい場合では,三つの色を変えなければならず取り扱いがやっかいです.

人間の色覚に合わせた表色系としてHSB(HSVとも呼ばれる)表色系といいうものがあります.この表色系は

* 色相(Hue):赤,黄,緑,水色,青,赤紫を円環上に並べ,赤を0°として,順番に60°ずつずらしながら配置します.値としては,赤を基準にした0〜360°の角度で表します.
* 彩度(Saturation):色の鮮やかさを表します.0〜100%の値で表します.0%は完全無彩色つまり灰色となり100%が純色となります.値が大きくなるに従って,色が鮮やかとなります.
* 明度(Brightness):明るさを表します.0〜100%の値で表します.0%は最も暗い黒,100%は最も明るい色となります.

code
(use math.const)
(use gl.processing)

(define (line* x0 y0 x1 y1 hue n)
  (let1 d (/. (- x1 x0) n)
    (let loop ((i 0) (x x0))
      (unless (> i n)
        (receive (r g b) (hsb->rgb hue i 100)
          (stroke r g b))
        (let1 x* (+ x d)
          (line x y0 x* y1)
          (loop (+ i 1) x*))))))

(define draw (draw-once$ (^ ()
                            (translate 100 100)
                             (dotimes (i 360)
                               (dotimes (j 3)
                                 (rotate 0.33333)
                                 (line* 0 1 90 1 i 100))))
                         :save "foo2.png"))

(define main (setup$ (^ () (window 200 200 "" 100 100))
                     :reshape (2d-elastic-reshape$ 200 200)
                     :draw draw))