7

所以我只是写了一个小片段来生成 Mandelbrot 分形,想象一下当它出现时我的惊讶和扭曲(如你在底部看到的那样)。我很感激为什么会发生这种情况。这是一种学习体验,我不是在寻找任何人为我做这件事,但我在调试它时有点走投无路。有问题的生成代码是:

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

嗯,图像是歪斜的,因为尺寸是错误的,但这很明显。您正在指定图像大小,然后吐出像素列表,但某处每行的像素数不正确。

更具体地说,请注意图像几乎恰好环绕一次:换句话说,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 已经解决了你的问题,但他有点“给你鱼”,而“教你如何钓鱼”可能更有用。

因此,我将分享我认为可能是达成解决方案的有用方法。

所以你的曼德布洛特形象是歪斜的。一些可能的原因:

  • 你的 mandelbrot 公式中有一个错误
  • 您在展示/保存图片时遇到错误

如果上述任何解释是否相关,您可以进行实验以进一步了解。例如,这样的实验可以是绘制诸如水平线和垂直线的琐碎图像。

做完那个实验后,你会发现你的垂直线不是那么垂直。回到可能的原因,很明显您在呈现/保存图像时存在错误,这可以解释一切。您的 mandelbrot 公式中可能仍然存在错误,但您可能没有,这与现在手头的问题无关。

现在你应该思考什么样的图像保存错误会导致垂直线对角线。如果没有出现任何想法,您可以使您的简单示例越来越小,直到 PPM 结果变得足够小,您可以手动检查它。那么你肯定会抓住这个错误。

于 2010-06-02T16:19:46.123 回答