Ich habe ein Programm erstellt, dessen Zweck es ist, einen fraktalen Satz (die Manderbrot-Set) zu zeichnen und es enthält keinen Syntaxfehler, sondern nur ein Pixel, nicht das Set.logischer Fehler in der Anzeige des Mandelbrot in Haskell gesetzt
hier ist mein Programm:
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
Ich kann Ihnen Erklärungen geben, wenn nötig. Ich testete bereits die Funktionen lignes & colones, es scheint in Ordnung.