アットウィキロゴ
大久保弘崇
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

大久保弘崇

7章メモ

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
Pan公式サイト http://conal.net/Pan/ ただしDownloadは全滅。
FOP公式サイトからはダウンロード可能。

PanはMicrosoft Visual C++を要求したり、後継のライブラリもwxHaskellを要求したり、
少なくともこの章の内容を確認するだけの目的には道具立てが大きすぎる。
当時から発達した計算機パワーに任せて力づくで計算させてしまうことが可能になった。
具体的には、なるべく簡単に済ませるために、PPMフォーマットでの画像書き出しを可能にするAC-PPMを用いる。

追記
http://www.acooke.org/pancito-code/
pancitoというライブラリが利用できるようです。

追記2
元ネタは http://lvelho.impa.br/ip02/papers/fip-lowres.pdf (JFPの記事?)
ここに練習問題7.10のパラメータと練習問題7.11のwipe2の定義もあるそうです。

独自のレンダリング関数を示す。
引数は順に、図関数、PPMファイル名、座標1辺りのピクセル数、左上座標、右下座標 (X座標は右に増加し、Y座標は下に増加するらしい)
結果はファイルに書き出すので IO ()
import Codec.PPM.Binary
import GHC.Word (Word8)
 
writeppm :: Image Colour -> String -> Float -> Point -> Point -> IO ()
writeppm image name size (l,d) (u,r) =
  do
    let h = truncate $ (u-d) * size :: Integer
        w = truncate $ (r-l) * size :: Integer
        pxs = [ (f28 red, f28 green, f28 blue)
              | j <- [0..w-1], let y = d + fromIntegral j / size
              , i <- [0..h-1], let x = l + fromIntegral i / size
              , let (blue,green,red,alpha) = image (x,y) ]
    writePPM name (h,w) pxs
  where
    f28 :: Frac -> Word8
    f28 x = min 255 . max 0 . truncate $ x * 255
 
なお、このコードはαが1でない色がどのように見えるかを考慮していない。

Image BoolをImage Colourに変換する補助関数も定義しておく。
-- Boolな図をレンダリングするための補助関数
black = (0,0,0,1)
white = (1,1,1,1)
b2c :: Bool -> Colour
b2c True = black
b2c False= white
 

最初の例vstripを次のように書きだす。
fig1 = writeppm (b2c.vstrip) "vstrip.ppm" 20 (-7/2,-7/2) (7/2,7/2)
 
結果(図7.1):(ただし、外枠を1ピクセル追加し、形式もpngに変換している)
次の例checkerも同様にする。(図7.2)
altRingsもかける。
fig3 = writeppm (b2c.altRings) "altRings.ppm" 20 (-5,-5) (5,5)
 
(図7.3)
polarCheckerも特に問題はない。(図7.4)
p.143で、[0,1]区間のグレースケールが現れる。
これをColourに変換する補助関数を定義する。0が白、1が黒でColourの重みとは逆であることに注意する。
g2c :: Frac -> Colour
g2c x = (1-x,1-x,1-x,1)
 
wavDistでこれを試す。(図7.5)

図7.7

lerpIはlerpCを持ち上げた関数である。
lerpC w c1 c2は[0,1]の重みに従って、c1をwの重み、c2を1-wの重みで混合する。
wavDistの中央は黒、グラデーションは黒が1なので、中央付近は1に近い値である。
つまり、lerpI wavDist blueI yellowI の中央はbuleIの重みが大きく、yellowIの重みは小さいのが正しい。
すなわち
が正しく、原著者のFigure 7.7は誤りである。

コメント

名前:
コメント:
記事メニュー
最近更新されたスレッド
ウィキ募集バナー