2016-04-02 1 views
0

J'ai créé un programme dont le but est de dessiner un ensemble fractal (l'ensemble manderbrot) et il ne contient aucune erreur de syntaxe, mais un seul pixel apparaît, pas l'ensemble.erreur logique dans l'affichage de l'ensemble de mandelbrot dans haskell

Voici mon programme:

module Main where 

import Graphics.UI.Gtk 
import Graphics.UI.Gtk.Builder() 
import Graphics.Rendering.Cairo as C 
import Control.Monad (when) 


main :: IO() 
main = do 
    _ <- initGUI 
    builder <- builderNew 
    builderAddFromFile builder "09-mandelbrot.ui" 

    window <- builderGetObject builder castToWindow "Figure de Mandelbrot" 
    canvas <- builderGetObject builder castToDrawingArea "drawingarea1" 
    _ <- onExpose canvas $ const (updateCanvas canvas) 

    widgetShowAll window 
    mainGUI 


updateCanvas :: DrawingArea -> IO Bool 
updateCanvas canvas = do 
    win <- widgetGetDrawWindow canvas 
    (width, height) <- widgetGetSize canvas 
    renderWithDrawable win $ example (fromIntegral width) (fromIntegral height) 
    return True 

k=100 

mandelbrot :: Double -> Double -> Bool 
mandelbrot a b = 
    let 
    mandelrec :: Double -> Double -> Int -> Bool 
    mandelrec x y i 
     | (x * x + y * y > 4) = False 
     | (i==k) && (x * x + y * y <= 4) = True 
     | otherwise = mandelrec x' y' (i+1) 
      where x' = x * x - y * y + a 
        y' = 2 * x * y + b 
    in mandelrec 0 0 0 

affiche :: (Double, Double) -> Render() 
affiche (a, b) = when (mandelbrot a b) $ C.rectangle a b 1 1 

colonnes w = [ t/w*4-2 | t<-[0..(w-1)] ] 
lignes h = [ t/h*4-2 | t<-[0..(h-1)] ] 


example :: Double -> Double -> C.Render() 
example width height = do 
    setSourceRGB 0 0 0 
    setLineWidth 1 

    mapM_ affiche (zip (colonnes width) (lignes height)) 
    stroke 

Je peux vous donner des explications en cas de besoin. J'ai déjà testé les fonctions lignes &, ça semble ok.

Répondre

1

Eh bien, cela fonctionne maintenant.

Je ne collectais pas tous les points de la plage [-2..2] [- 2..2] mais seulement ceux placés dans la diagonale.

ici est un code valide:

module Main where 

import Graphics.UI.Gtk 
import Graphics.UI.Gtk.Builder() 
import Graphics.Rendering.Cairo as C 
import Control.Monad (when) 


main :: IO() 
main = do 
    _ <- initGUI 
    builder <- builderNew 
    builderAddFromFile builder "09-mandelbrot.ui" 

    window <- builderGetObject builder castToWindow "Figure de Mandelbrot" 
    canvas <- builderGetObject builder castToDrawingArea "drawingarea1" 
    _ <- onExpose canvas $ const (updateCanvas canvas) 

    widgetShowAll window 
    mainGUI 


updateCanvas :: DrawingArea -> IO Bool 
updateCanvas canvas = do 
    win <- widgetGetDrawWindow canvas 
    (width, height) <- widgetGetSize canvas 
    renderWithDrawable win $ example (fromIntegral width) (fromIntegral height) 
    return True 

k :: Int 
k=100 

mandelbrot :: Double -> Double -> Bool 
mandelbrot a b = 
    let 
    mandelrec :: Double -> Double -> Int -> Bool 
    mandelrec x y i 
     | (x * x + y * y > 4) = False 
     | (i==k) && (x * x + y * y <= 4) = True 
     | otherwise = mandelrec x' y' (i+1) 
      where x' = x * x - y * y + a 
        y' = 2 * x * y + b 
    in mandelrec 0 0 0 

affiche2 :: Double -> Double -> Render() 
affiche2 a b = do 
    C.rectangle a b 1 1 
    stroke 

affiche :: ((Double,Double), (Double,Double)) -> Render() 
affiche ((a0,a), (b0,b)) = when (mandelbrot a b) $ affiche2 a0 b0 

colonnes w = [ (t,t/w*4-2) | t<-[0..(w-1)] ] 
lignes h = [ (t,t/h*4-2) | t<-[0..(h-1)] ] 
points w h = [ (colonne,ligne)| colonne <- colonnes w,ligne <- lignes h] 

example :: Double -> Double -> C.Render() 
example width height = do 
    setSourceRGB 0 0 0 
    setLineWidth 1 

    mapM_ affiche (points width height) 
    stroke