IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Haskell Discussion :

Problème Complex pour Burning Ship


Sujet :

Haskell

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 113
    Points : 64
    Points
    64
    Par défaut Problème Complex pour Burning Ship
    Bonjour,
    J'ai un petit code qui inclu les fonctions pour nombres complexes. Pour Mandelbrot et Julia aucun problème.
    (Voir les possibilités et les résultats sur http://haskellaskvasil.wordpress.com).
    Par contre, dès que je modifie la dernière ligne d'itération pour dessiner Burning Ship, j'ai le message :

    BurningShip.hs:77:26:
    Couldn't match expected type `Complex' with actual type `Float'
    In the return type of a call of `real'
    In the first argument of `abs', namely `(real (z))'
    In the first argument of `(+)', namely `abs (real (z))'

    BurningShip.hs:77:41:
    Couldn't match expected type `Complex' with actual type `Float'
    In the return type of a call of `im'
    In the first argument of `abs', namely `(im (z))'
    In the second argument of `(+)', namely `abs (im (z))'


    Voici le code en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    import Graphics.Rendering.OpenGL
    import Graphics.UI.GLUT
    import Data.IORef
     
    data Complex = C (Float, Float) deriving (Show,Eq)
     
    instance Num Complex where
        fromInteger n = C (fromIntegral n,0.0)
        C (x,y) * C (z,t) = C (z*x - y*t, y*z + x*t)
        C (x,y) + C (z,t) = C (x+z, y+t)
        abs (C (x,y))     = C (sqrt (x*x + y*y),0.0)
        signum (C (x,y))  = C (signum x , 0.0)
     
    complex :: Float -> Float -> Complex
    complex x y = C (x,y)
     
    real :: Complex -> Float
    real (C (x,y))    = x
     
    im :: Complex -> Float
    im   (C (x,y))    = y
     
    magnitude :: Complex -> Float
    magnitude = real.abs
     
    main :: IO ()
    main = do
      (progname,_) <- getArgsAndInitialize
      initialDisplayMode $= [DoubleBuffered]
      initialWindowSize $= Size 320 320
      createWindow "Mandelbrot Set"
      displayCallback $= display
      putStr "PATIENTEZ - La fenetre avec l'image sera affichee a la fin du traitement"
      display
      mainLoop
     
    display = do
      clear [ColorBuffer] -- make the window black
      loadIdentity -- reset any transformation
      preservingMatrix drawMandelbrot
      swapBuffers -- refresh screen
     
     
    drawMandelbrot =
      renderPrimitive Points $ do
        mapM_ drawColoredPoint allPoints
      where
          drawColoredPoint (x,y,c) = do
              color c -- set the current color to c
              vertex $ Vertex3 x y 0 
     
    width = 320 :: GLfloat
    height = 320 :: GLfloat
     
    allPoints :: [(GLfloat,GLfloat,Color3 GLfloat)]  --  $ julia x y )
     
    allPoints = [ ((x-100)/width,y/height,colorFromValue $ mandel x y) | 
                      x <- [-width+100..width+100], 
                      y <- [-height..height]]
     
    colorFromValue n =
      let 
          t :: Int -> GLfloat
          t i = 0.5 + 0.5*sin( fromIntegral i / 1 )
      in
        Color3 (t n) (t (n+5)) (t (n+10))
     
    mandel x y = 
      let r = realToFrac $ 0.5 * x / width 
          i = realToFrac $ 0.5 * y / height
      in
          f (complex r i) 0 64 
     
    {-
    julia x y =
          let r = realToFrac $ 2 * x / width 
              i = realToFrac $ 2 * y / height
    	  s = -0.7
    	  p = 0.2715
          in
              f (complex s p) (complex r i) 128-}
     
    f :: Complex -> Complex -> Int -> Int
    f c z 0 = 0
    f c z n = if (magnitude z > 2 ) 
              then n
              else f c ((z*z) + c) (n-1)    -- Burning Ship ((abs(real(z)) + abs(im(z)))^2 + c) (n-1)
    J'ai tout essayé, je n'y arrive pas. Pourrai-on svp me mettre sur la bonne voie ?

    Si j'utilise module Complex (import Data.Complex) avec realPart et imagPart, j'ai un autre message :

    BurningShipComplex.hs:57:26:
    Expecting one more argument to `Complex'
    In the type signature for `f':
    f :: Double -> Double -> Complex -> Complex -> Int -> Int


    Merci d'avance.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    C'est curieux, chez moi le code compile tout à fait. En revanche j'ai lancé main à tout hasard, une fenêtre vide s'est affichée, 10, 20, 30 secondes ou plus et j'ai décidé d'interrompre les calculs...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 113
    Points : 64
    Points
    64
    Par défaut
    Vous avez lancé avec la ligne modifiée pour burining slip?
    Seul ce cas ne marche pas.
    Dans winCGHi ?
    Il faut patienter un peu, comme tout les mandelbrot c'est un peu long.
    Avec la ligne display avant mainLoop la fenêtre doit s'afficher a la fin du traitement.
    Avons nous des versions différentes du CGHi ? J'ai installé la plateforme début mai 1914.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par vasilpapa Voir le message
    Avons nous des versions différentes du CGHi ? J'ai installé la plateforme début mai 1914.
    mai 1914 alors oui, nous avons probablement des versions différentes... J'essaie de mettre ma plate-forme à jour régulièrement.

    Je n'avais pas modifié la ligne pour Burning Ship, je crois voir maintenant de quoi il s'agit:
    la signature de la fonction f est Complex -> Complex -> Int -> Int

    Or : ((abs(real(z)) + abs(im(z)))^2 + c) qui correspond au deuxième argument, est un Float, pas un Complex. D'où la protestation du compilateur. J'imagine qu'en modifiant la signature vous devriez pouvoir compiler le code.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 113
    Points : 64
    Points
    64
    Par défaut
    J'ai essayé de modifier la signature, mais le compilateur protesté, c'est pire.
    Si vous trouvez la bonne signature ca serait formidable.

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par vasilpapa Voir le message
    Il faut patienter un peu, comme tout les mandelbrot c'est un peu long.
    Mon code final n'est pas particulièrement lent : il recalcule l'image plusieurs fois par seconde et j'obtiens un rendu fluide même sur une machine qui a bien 6,7 ans (testé pendant mes vacances).


    Pour ton code, le problème ici c'est que "c" est un Complex. Comme tu essaies de l'ajouter à "(abs(real(z)) + abs(im(z)))^2", GHC s'attend ("expect") à ce que cette expression soit aussi un Complex. Mais il s'agit d'un Float car real et im renvoie des Floats et les opérations suivantes (abs, ^2) ne modifient pas le type. Je suppose que tu pourrais convertir de nouveau cette expression en Complex (la version de ce fichier) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let r = abs (real z) + abs (im z) in f c (complex (r^2) 0 + c) (n-1)
    Il est également possible que tu ne souhaites pas que "c" soit un complexe, il faudra alors changer la signature et l'invocation de f.

    --
    Jedaï

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 113
    Points : 64
    Points
    64
    Par défaut
    Ca ne marche pas; (complex (r^2)) a un seul argument alors qu'il en faut deux.
    Mais vous m'avez mis sur la voie, voici la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    f :: Complex -> Complex -> Int -> Int
    f c z 0 = 0
    f c z n = if (magnitude z > 2 ) 
              then n
              else let a = abs (real (z))
                       b = abs(im (z)) 
    			in f c ( (complex a b)^2 + c) (n-1)
    Merci.
    Avant de fignoler la première image :
    Nom : BurningShip9.jpg
Affichages : 191
Taille : 51,0 Ko
    N'oubliez pas de changer y en -y!

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par vasilpapa Voir le message
    Ca ne marche pas; (complex (r^2)) a un seul argument alors qu'il en faut deux.
    C'est pour ça qu'il y avait un 0 en second argument... Dans ton code d'origine tu mettais "|a|+|b|" au carré, pas "|a|+|b|i" mais il s'agissait je suppose d'une erreur de ta part si tu obtiens la bonne image avec ta nouvelle version.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 113
    Points : 64
    Points
    64
    Par défaut
    Oui, c'était une erreur, maintenant tout vas bien, merci. Même les zooms :
    Nom : BurningShipZOOMbon.jpg
Affichages : 218
Taille : 42,6 KoNom : BurningShipZOOMcoul.jpg
Affichages : 265
Taille : 72,7 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HOOK] Problème(s) pour réaliser le tutoriel sur les HOOKS
    Par Rodrigue dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/07/2016, 18h22
  2. Réponses: 7
    Dernier message: 18/06/2015, 02h00
  3. [XL-2007] Problème trop complexe pour débutant
    Par hausen dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 27/01/2010, 23h29
  4. Réponses: 5
    Dernier message: 12/12/2009, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo