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 :

[article] Raytracer minimaliste en Haskell : Affichage d'une sphère [Tutoriel]


Sujet :

Haskell

  1. #1
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut [article] Raytracer minimaliste en Haskell : Affichage d'une sphère
    Un article dont le but est d'illustrer le développement en haskell à travers un raytracer. Dans ce premier article, on définit les types qui représente les données que l'on doit manipuler, et on met tout en place pour afficher un premier objet : une simple sphère.

    Meme si le résultat peut paraitre élémentaire, tous au long de l'article nous métons en place les outils qui nous servirons. Caméra, calcule des intersections sur une liste d'objets, etc.

    L'article est disponible ici : http://cochoy-jeremy.developpez.com/...haskell_rt_p1/
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Points : 870
    Points
    870
    Par défaut
    Très bonne initiative.
    J’attends la suite avec impatience

    J’ai un peu mis Haskell de côté ces derniers temps, mais ça pourrait me donner envie de m’y remettre.

  3. #3
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut Mes commentaires sur ton blog
    Désolé, je me suis permis de commenter tes billets blog Haskell.

    J'ai tenu compte de ton parti-pris (introduire très tôt la définition d'une catégorie).
    J'ai tenté de faire des commentaires constructifs, c'est-à-dire de signaler un maximum d'endroits où tu aurais pu tirer un meilleur avantage de ton parti-pris.
    J'ai cherché, je n'ai pas trouvé d'où te viens l'orthographe cathégorie.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  4. #4
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Désolé, je me suis permis de commenter tes billets blog Haskell.

    J'ai tenu compte de ton parti-pris (introduire très tôt la définition d'une catégorie).
    J'ai tenté de faire des commentaires constructifs, c'est-à-dire de signaler un maximum d'endroits où tu aurais pu tirer un meilleur avantage de ton parti-pris.
    J'ai cherché, je n'ai pas trouvé d'où te viens l'orthographe cathégorie.
    Tu n'a pas à t'excuser pour ça, au contraire

    Par contre, le thread étant à propos de l'article publié sur DVP, je ne suis pas sur que ce soit l'endroit le plus opportun pour discuter de ça.

    Mais je m'autorise quand même à te répondre ici :p

    • Merci.
    • Merci, je vais les lire avec attention.
    • Moi non plus je n'ai pas trouvé
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  5. #5
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut Lapin compris...
    Impossible de compiler ce raytracer, je n’arrête pas de tomber sur des erreurs.

    Par exemple (c’est la première) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    --Ne conserve que les intersections devant la caméra, et récupère la plus proche
    getClosestIntersection :: [Intersection] -> Scene -> Maybe Intersection
    getClosestIntersection intersections = return intersection
      where
        allowedIntersections = filter isAhead intersections
        isAhead intersection@(_, distance, _) = distance > 0
        compareZ a b = compare ad bd
          where
            (_, ad, _) = a
            (_, bd, _) = b
        closestIntersection = minimumBy compareZ allowedIntersections
        intersection = if null allowedIntersections
                       then Nothing
                       else Just closestIntersection
    Me donne l’erreur :
    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
    src/Raytracer.hs:62:40:
        No instance for (Monad ((->) Scene))
          arising from a use of `return'
        Possible fix: add an instance declaration for (Monad ((->) Scene))
        In the expression: return intersection
        In an equation for `getClosestIntersection':
            getClosestIntersection intersections
              = return intersection
              where
                  allowedIntersections = filter isAhead intersections
                  isAhead intersection@(_, distance, _) = distance > 0
                  compareZ a b
                    = compare ad bd
                    where
                        (_, ad, _) = a
                        (_, bd, _) = b
                  closestIntersection = minimumBy compareZ allowedIntersections
                  ....
    Qui me semble assez logique et que je corrige simplement en réécrivant la ligne qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getClosestIntersection intersections _ = intersection
    Le truc c’est qu’il y en a d’autres... Alors quel est le problème : mauvais compilateur (GHC 7.4.2), mauvaise option, mauvaise compréhension ?

  6. #6
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    Impossible de compiler ce raytracer, je n’arrête pas de tomber sur des erreurs.

    Par exemple (c’est la première) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    --Ne conserve que les intersections devant la caméra, et récupère la plus proche
    getClosestIntersection :: [Intersection] -> Scene -> Maybe Intersection
    getClosestIntersection intersections = return intersection
      where
        -- ...
    Me donne l’erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    src/Raytracer.hs:62:40:
        No instance for (Monad ((->) Scene))
          arising from a use of `return'
        Possible fix: add an instance declaration for (Monad ((->) Scene))
     
    Qui me semble assez logique et que je corrige simplement en réécrivant la ligne qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getClosestIntersection intersections _ = intersection
    Le truc c’est qu’il y en a d’autres... Alors quel est le problème : mauvais compilateur (GHC 7.4.2), mauvaise option, mauvaise compréhension ?
    Les deux façon d'écrire cette fonction
    - l'une avec return qui place intersection::Maybe Intersection dans un contexte, ici (->) Scene
    - et l'autre avec une fonction qui prend scène en argument et l'ignore,
    sont valides. L'idée était de faire ressortir l'aspect monadique de "(->) r", en insistant avec les return et les >>=.

    L'erreur indique qu'il ne sais pas en quoi "(->) Scene" est une monade.

    Pour ma part, j'ai testé et compilé avec ghc/ghci 7.6.3.

    Il est tout à fait possible que les versions précédentes instancie "(->) r" en tant que monade à l'extérieur de Control.Monad ou Control.Monad.Instances, et ne l'exporte pas dans le prélude.

    Essaye d'ajouter "import Control.Monad".
    Si ça ne fonctionne pas "import Control.Monad.Instances", mais le module est déprécié (http://hackage.haskell.org/packages/...Instances.html).

    Confirme moi que c'est ça, et je met à jour l'article pour ajouter cette ligne

    (Pour voir comment return agit sur le type (->) Scene et comment c'est une instance de Monad :
    http://www.haskell.org/ghc/docs/late...rol-Monad.html
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  7. #7
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Ajouter import Control.Monad.Instances dans le fichier Raytracer.hs règle effectivement le problème. Il ne me reste maintenant plus qu’à apprivoiser cette Monad ((->) r).

  8. #8
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    Ajouter import Control.Monad.Instances dans le fichier Raytracer.hs règle effectivement le problème. Il ne me reste maintenant plus qu’à apprivoiser cette Monad ((->) r).
    Est-ce que import Control.Monad ne suffit pas?

    Pour (->) r, tu peux le voir déjà comme type fonctoriel (comme "type Foncteur a = r -> a"). Learn you haskell for great good en parle, par ici http://learnyouahaskell.com/functors...functors-redux
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  9. #9
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Citation Envoyé par Zenol Voir le message
    Est-ce que import Control.Monad ne suffit pas?
    Niet. Il faut le module Control.Monad.Instances.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/06/2013, 01h55

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