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

大久保弘崇

ex7.1

最終更新:

hirotakaohkubo

- view
管理者のみ編集可

7.1

正規化済みαなので、lightenの対象は(1,1,1,a)ではなく(a,a,a,a)となる。
処理対象の色の要素を読み取る必要がある形が微妙。
lighten, darken, fade :: Frac -> Colour -> Colour
lighten w (b,g,r,a) = lerpC w (a,a,a,a) (b,g,r,a)
darken  w (b,g,r,a) = lerpC w (0,0,0,a) (b,g,r,a)
fade    w (b,g,r,a) = lerpC w (0,0,0,0) (b,g,r,a)
 
動作確認のために、
checkerの元絵は-3.5<x,y<3.5の範囲が描画されている
  • 3より外はid
  • それより内側は、xが正の範囲はx/3でlighten、負の範囲は-x/3でdarken
  • さらに、y^2/9 で fade させる
  • つまりいずれも最外周で強さを1とする
というフィルタを red に施した絵
を checker に重ねた絵
を作ってみる
ex71 = writeppm (ex71i `over` (b2c.checker)) "ex71.ppm" 20 (-7/2,-7/2) (7/2,7/2) where
  ex71i :: ImageC
  ex71i (x,y) = (if abs x >= 3 || abs y >= 3 then id else 
                  (if x >= 0 then lighten (x/3) else darken (-x/3))
                  .
                  fade (y^2/9) )
               $ red
 

Panの配布物に含まれていた正解は以下のとおり。
lighten w = lerpC w white
darken  w = lerpC w black
fade    w = lerpC w invisible -- これは上と同じ
 
上と同じ計算を行うと結果が異なる。これは、lighten, darkenでαが1の色に向けて動かしていることが原因。
どちらが正解かはよくわからない。

7.2

原著者が公開しているPDF版を見ると、図7.6は
青白
黒赤
のようになっている。
まず blue-black, red-white 間を y で lerpC し、その結果を x で lerp する。
bilerpC :: Colour -> Colour -> Colour -> Colour -> (Frac,Frac) -> Colour
bilerpC black red blue white (x,y) = lerpC x' r l where
  y' = min 1 . max 0 $ y
  x' = min 1 . max 0 $ x
  l = lerpC y' black blue
  r = lerpC y' red white
 
fig6 = writeppm (bilerpC black red blue white) "ex72.ppm" 140 (0,0) (1,1)
 
図6を再現した結果を示す。

7.3, 7.4

逆にいうと、図7.8が正しく作れるように問題7.3は作る。
bwIm, byIm :: Image Bool -> ImageC
bwIm a = cond a blackI whiteI
byIm a = cond a yellowI blueI
 
fig8 = writeppm ex74 "ex74.ppm" 30 (-7/2,-7/2) (7/2,7/2) where
  ex74 :: ImageC
  ex74 = lerpI wavDist (byIm checker) (bwIm (polarChecker 10))
 

7.5

clift1 :: (Frac->Frac) -> (Colour->Colour)
clift1 h (b,g,r,a) = (h b, h g, h r, h a)
clift2 :: (Frac->Frac->Frac) -> (Colour->Colour->Colour)
clift2 h (b1,g1,r1,a1) (b2,g2,r2,a2) = (h b1 b2, h g1 g2, h r1 r2, h a1 a2)
 
lerpC' w = clift2 (\ x1 x2 -> w * x1 + (1-w) * x2)
overC' (c1@(_,_,_,a1)) c2 = clift2 (\ x1 x2 -> x1 + (1-a1) * x2) c1 c2
 
overCがこれで正しいか自信がない。というかa1を覗いているところがとても気持ち悪い。

コメント

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