Image 为什么图像(曼德尔布罗特)会被扭曲和环绕?

Image 为什么图像(曼德尔布罗特)会被扭曲和环绕?,image,haskell,mandelbrot,Image,Haskell,Mandelbrot,所以我只写了一个小片段来生成Mandelbrot分形,想象一下当它变得丑陋和扭曲时我的惊讶(如下图所示)。我想知道为什么会发生这种情况。这是一次学习经历,我不想找任何人帮我做,但我调试它有点走不通了。有问题的生成代码是: module Mandelbrot where import Complex import Image main = writeFile "mb.ppm" $ imageMB 1000 mandelbrotPixel x y = mb (x:+y) (0:+0) 0 mb

所以我只写了一个小片段来生成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

嗯,图像倾斜是因为尺寸错误,但这是显而易见的。您正在指定图像大小,然后弹出一个像素列表,但每行的像素数不正确

更具体地说,请注意图像几乎只环绕一次:换句话说,
每行倾斜*图像高度=图像宽度
。因为图像是正方形的,这意味着每行生成一个额外的像素——一个很好的错误

发生这种情况的明显地方是在生成要迭代的坐标时。让我们尝试一个小集合,看看它给了我们什么:

> length $ argandPlane (-2.5) (-2) 1.5 2 10 10
121
> 10 ^ 2
100
> 11 ^ 2
121
等等。我怀疑错误是因为你计算的增量是实际距离除以像素大小,这会生成正确的间隔数,但会产生一个额外的点。考虑从0到1的间隔。使用宽度为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即可

这是一次学习经历,我不想找任何人帮我做,但我调试它有点走不通了

我知道卡姆坎已经解决了你的问题,但他“给了你鱼”,而“教你如何钓鱼”可能更有用

因此,我将与大家分享我认为是达成解决方案的一种有用方法

所以你的mandelbrot图像是倾斜的。一些可能的原因:

  • 你的mandelbrot公式有缺陷
  • 您在展示/保存图片时存在错误
你可以做一个实验来进一步了解上述任何解释是否相关。例如,这样一个实验可以画一些简单的图像,比如水平线和垂直线

在做了那个实验之后,你会发现你的垂直线不是那么垂直。回到可能的原因,很明显,您在显示/保存图像时存在缺陷,这就解释了一切。你的曼德尔布罗特公式中可能还有一个漏洞,但你可能没有,这与当前的问题无关


现在,您应该考虑什么样的图像保存缺陷会导致垂直线呈对角线。如果没有想法弹出,你可以使你的简单的例子越来越小,直到PPM结果变得足够小,你可以检查它的手。然后你肯定会发现这个错误。

你是想添加一个指向图像文件的链接吗?我对曼德布罗特的看法:不能要求更好的答案。非常感谢,先生。当然,使用(宽度-1)更有意义,最初在阅读了您的答案后,我使用了tailOh,如果有人感兴趣,这个错误甚至有一个特定的术语:a.我试图至少按照我自己遵循的大致顺序来讨论解决方案,但是我很匆忙,没有像你说的那么详细——谢谢你这么做。特别是,注意到“每行多出一个像素”是我如何缩小它以协调生成的,而GHCi片段是一个实验来验证这个假设。非常感谢,下次我陷入困境时,我会记住这些事情。在你的回答和camccann的回答之间,我想我得到了我想要的一切。
> 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