7

そこで、マンデルブロ フラクタルを生成するための小さなスニペットを書きましたが、それがすべて醜く歪んだ結果になったときの驚きを想像してみてください (下の画像をご覧ください)。なぜこれが起こるのかという方向性のポイントをいただければ幸いです。これは学習体験であり、私のために誰かを探しているわけではありませんが、デバッグで行き詰まっています。問題のある生成コードは次のとおりです。

module Mandelbrot where
import Complex
import Image

main = writeFile "mb.ppm" $ imageMB 1000

mandelbrotPixel x y = mb (x:+y) (0:+0) 0

mb c x iter | magnitude x > 2 = iter
            | iter >= 255     = 255
            | otherwise       = mb c (c+q^2) (iter+1)
    where q = x -- Mandelbrot
          -- q = (abs.realPart $ x) :+ (abs.imagPart $ x) --Burning Ship

argandPlane x0 x1 y0 y1 width height = [ (x,y) | 
        y <- [y1, y1 - dy .. y0], --traverse from
        x <- [x0, x0 + dx .. x1] ] --top-left to bottom-right
    where dx = (x1 - x0) / width
          dy = (y1 - y0) / height

drawPicture :: (a -> b -> c) -> (c -> Colour) -> [(a, b)] -> Image
drawPicture function colourFunction = map (colourFunction . uncurry function)

imageMB s = createPPM s s
        $ drawPicture mandelbrotPixel (replicate 3)
        $ argandPlane (-1.8) (-1.7) (0.02) 0.055 s' s'
    where s' = fromIntegral s

そして、画像コード(私はかなり自信を持っています)は次のとおりです。

module Image where

type Colour = [Int]
type Image = [Colour]

createPPM :: Int -> Int -> Image -> String
createPPM w h i = concat ["P3 ", show w, " ", show h, " 255\n",
    unlines.map (unwords.map show) $ i]

醜いマンデルスキューのもの

4

2 に答える 2

16

寸法が間違っているので画像が歪んでいますが、それは明らかです。画像サイズを指定してからピクセルのリストを吐き出していますが、どこかで行ごとのピクセル数が正しくありません。

より具体的には、画像がほぼ 1 回ラップアラウンドすることに注意してくださいskew per line * height of the image = width of the image。画像は正方形なので、行ごとに余分なピクセルを生成していることになります。これは古き良きオフバイワン エラーです。

これが発生する明らかな場所は、反復する座標を生成するときです。小さなセットを試して、何が得られるか見てみましょう:

> length $ argandPlane (-2.5) (-2) 1.5 2 10 10
121
> 10 ^ 2
100
> 11 ^ 2
121

など。エラーは、実際の距離をピクセル サイズで割った値としてインクリメントを計算しているためだと思われます。これにより、正しい間隔数が生成されますが、余分なポイントが発生します。0.0 から 1.0 までの間隔を考えてみましょう。幅 4 の計算を使用すると、次のようになります。

> let x0 = 0.0
> let x1 = 1.0
> let width = 4.0
> let dx = (x1 - x0) / width
> dx
0.25
> let xs = [x0, x0 + dx .. x1]
> xs
[0.0, 0.25, 0.5, 0.75, 1.0]
> length xs
5

したがって、正しいポイント数を取得するには、座標を生成するときにサイズを 1 減らします。

于 2010-06-02T13:40:43.650 に答える
4

それは学習体験であり、私のために誰かを探しているわけではありませんが、デバッグで行き詰まっています

camccann がすでにあなたの問題を解決していることは知っていますが、彼は一種の「魚を与えた」一方で「釣り方を教えた」方がより役立つ可能性があります。

そのため、解決策に到達するための有用な方法であると私が信じていることを共有します。

したがって、マンデルブロ画像は歪んでいます。いくつかの考えられる原因:

  • マンデルブロの式にバグがあります
  • 写真の表示/保存にバグがあります

上記の説明のいずれかが関連しているかどうかをさらに調べるために、実験を行うことができます。このような実験は、たとえば、水平線と垂直線の些細なイメージを描くことです。

その実験を行った後、垂直線がそれほど垂直ではないことがわかります. 考えられる原因に戻ると、画像の表示/保存にバグがあることは明らかであり、それがすべてを説明しています. マンデルブロの式にまだバグがあるかもしれませんが、おそらくそうではなく、それは現在の問題とは関係ありません。

ここで、どのような画像保存バグが縦線を斜めにするのかを考えてみてください。アイデアが浮かび上がらない場合は、PPM の結果が手で調べられるほど小さくなるまで、簡単な例をどんどん小さくしていきます。そうすれば、必ずバグをキャッチできます。

于 2010-06-02T16:19:46.123 に答える