大久保弘崇
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 する。
青白
黒赤
のようになっている。
まず 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を覗いているところがとても気持ち悪い。