インデックスを使うデータ型について二つ質問があります。
1. wxHaskell 8.0 の Bitmap 管理改善は直接 Bitmap が扱え
るようにしただけであって Pixel buffer の扱いを改善したようで
はないようです。
そのため以下の関数で画像の Filter 関数を書こうを書くことはでき
ません(メモリ管理の都合上プログラムが正常に動かなくなります)が、
新たに pixelBufferCreate と pixelBufferDelete が加わっ
たため、Point x y をインデックスとし Int を格納するデータ型
として定義すればなんとかなりそうな気がします。……が、Haskell
で Multiarray ってありましたっけ? もしくはどのように定義す
ればよいでしょうか?
* sample の wxcore の ImageViewer の関数を書き換え
onPaint vbitmap dc viewArea
= do mbBitmap <- varGet vbitmap
case mbBitmap of
Nothing -> dcClear dc
-- Just bm -> drawBitmap dc bm pointZero False []
Just bm ->
do
bsz <- bitmapGetSize bm
im <- imageCreateFromBitmap bm
pxe <- imageGetPixelBuffer im
let pixelPoint (Size ppx ppy) n = [Point x y | x <-
[n..ppx-n], y <- [n..ppy-n]]
let addRGB rgb1 rgb2 = colorFromInt $ (intFromColor
rgb1) + (intFromColor rgb2)
let drawLowpassFilter pb (Point szx szy) = do
lowpass <- (lowpassFilter pxe (Point szx szy) bsz)
pixelBufferSetPixel pb (Point szx szy) lowpass
let fillpixelBuffer pb = do
mapM_ (drawLowpassFilter pb) (pixelPoint bsz 0)
return pb
px2 <- fillpixelBuffer pxe
im2 <-imageCreateFromPixelBuffer px2
bm2 <- bitmapCreateFromImage im2 (-1)
bitmapDelete bm
imageDelete im
drawBitmap dc bm2 pointZero True []
where
pixelColorInt pix (Point ptx pty) (Size szx szy)
| ptx < 0 = pixelColorInt pix (Point 0 pty)
(Size szx szy)
| pty < 0 = pixelColorInt pix (Point ptx 0)
(Size szx szy)
| ptx > szx = pixelColorInt pix (Point ptx pty)
(Size 0 szy)
| pty < szy = pixelColorInt pix (Point ptx pty)
(Size 0 szy)
| otherwise = do
pixel <- pixelBufferGetPixel pix (Point ptx
pty)
return (intFromColor pixel)
lowpassFilter pix (Point szx szy) bound = do
-- pixelsInt <- foldM (+) (pixelColorInt pix
[Point x y | x <- [szx-n..szx+n], y <- [szy-n..szy+n]])
pix1 <- pixelColorInt pix (Point (szx-1)
(szy-1)) bound
pix2 <- pixelColorInt pix (Point (szx-1) (szy))
bound
pix3 <- pixelColorInt pix (Point (szx-1)
(szy+1)) bound
pix4 <- pixelColorInt pix (Point (szx) (szy-1))
bound
pix5 <- pixelColorInt pix (Point (szx) (szy))
bound
pix6 <- pixelColorInt pix (Point (szx) (szy+1))
bound
pix7 <- pixelColorInt pix (Point (szx+1)
(szy-1)) bound
pix8 <- pixelColorInt pix (Point (szx+1) (szy))
bound
pix9 <- pixelColorInt pix (Point (szx+1)
(szy+1)) bound
let pixes = (pix1 + pix2 + pix3 + pix4 + pix5
+ pix6 + pix7 + pix8 + pix9) `div` 9
return (colorFromInt pixes) -- (colorFromInt
$ (pixelsInt / 9))
2. SML の以下の定義を Haskell に置き換えるために MultiIndex
の Hash 関数を定義しようと思っているのですが、何かエレガント
なアイデアはあるでしょうか?
Data.HashTable の上に Monad を使って定義することもできま
すが、そうするとコードが命令型っぽくなって美しくありません。
structure TransTbl = Hash2TableFn (
structure Key1 = struct
type hash_key = thread_id
val hashVal = hashTid
val sameKey = sameTid
end
structure Key2 = struct
type hash_key = int
val hashVal = Word.fromInt
val sameKey = (op = : (int * int) => bool)
end)
--
shelarcy <shelarcy / capella.freemail.ne.jp>
http://page.freett.com/shelarcy/