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

Caml Discussion :

Definition d'un type rotation


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut Definition d'un type rotation
    Salut a tous,

    Voila je suis débutant en ocaml et j'ai un projet a faire . Il consiste a écrire des fonctions et des types permettant d'effectuer des transformations d'objets dans un espace tri-dimensionnel .


    Je sais qu'une rotation d'un plan dans l'espace correspond a celle de son vecteur normal par rapport à l'axe x, y ou z.

    Elle correspond à la multiplication d'une matrice d'une des trois matrices de rotations M (selon l'axe choisi) et du vecteur V en question

    Ainsi on a M x V

    On me demande de definir le type Rotation or je ne sais pas à quoi cela correspond : le vecteur rotation ? Le produit de M et V ? Autre ?


    Merci d'avance !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Il me semble que les deux représentation sont possibles (mais mes souvenirs de géométries sont... lointains dira-t-on), puisqu'équivalentes, d'un point de vue mathématique (tu peux passer à volonté de l'une à l'autre)

    Pour choisir un "bon" type, il faut savoir ce que tu vas en faire (il me semble que pour ça les deux représentations ne sont pas équivalentes). Est ce que tu vas juste appliquer la rotation à des points, au quel cas il faut que tu prennes la représentation la plus simple pour ça. Est ce que tu vas composer des rotations ? Ou autre chose ?

    Après, pour mémoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # (true, "salut", 1);;
    - : bool * string * int = (true, "salut", 1)
    # [1;2;3;4;5];;
    - : int list = [1; 2; 3; 4; 5]
    # [|1;2;3;4|];;
    - : int array = [|1; 2; 3; 4|]
    # [| [|1;2|]; [|3;4|] |];;
    - : int array array = [|[|1; 2|]; [|3; 4|]|]
    (si ceci n'est pas clair, c'est un peu le but, c'est pour éviter de balancer des solutions trop claires )

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    En fait mon but et d'apres pouvoir créer une fonction Rotation qui va prendre en paramètres un objet de type rotation , un objet géométrique (ici Sphère, plan ou boite ) et renvoyer l'objet après transformation !!

    on aura la fonction Rotate : rotation -> Objet1->objet2 en gros


    Je n'arrive pas a detrminer ce que doit contenir un objet Rotation... =(


    Merci encore !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Avant de commencer par des plans et des sphères, commence par un simple point dans l'espace !

    Que doit contenir une "rotation" pour pouvoir écrire une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rotation_point: rotation -> point -> point
    ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Bah je pourrai représenter l'objet Rotation (étant donné que la rotation peut se faire selon l'axe des x, y ou z ) comme ceci

    ( Rx, Ry,Rz) ou R de type int represente l'angle selon l'axe ! Exemple si on veut faire une rotation de 20° vers la droite d'axe x , on aurait let Rotation r= (20,0,0)


    Qu'en pensez vous ?

    Merci !

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Citation Envoyé par 44Magnum Voir le message
    Bah je pourrai représenter l'objet Rotation (étant donné que la rotation peut se faire selon l'axe des x, y ou z ) comme ceci

    ( Rx, Ry,Rz) ou R de type int represente l'angle selon l'axe !
    Si l'angle est en radian par exemple, j'imagine que des flottants seraient une meilleur idée

    Citation Envoyé par 44Magnum Voir le message
    Exemple si on veut faire une rotation de 20° vers la droite d'axe x , on aurait let Rotation r= (20,0,0)
    On approche d'une solution pas mal Mais le "let Rotation r =", j'ai jamais vu ça en Caml ! Il va falloir relire le cours qui va bien pour retrouver la bonne façon de définir un type !

    Bonne chance

  7. #7
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Une autre question que tu peux te poser : est-ce que tu feras toujours des rotations sur un seul axe à chaque fois, ou peut-on faire une rotation sur X suivie d'une autre sur Y et ainsi de suite ? Si on ne fait pas de rotations multiples, un seul flottant suffit.

    Cordialement,
    Cacophrène

  8. #8
    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 Voir FAQ math pour les jeux

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Hey salut a tous, désolé je n'ai pas eu le temps de revenir sur le forum !


    Voila j'ai une nouvelle question

    imaginons que j'ai defini un type sphere de la sorte :

    type sphere={c : point; r : rayon}

    (c est son centre)

    avec bien entendu au préalable

    type point = { x:float; y:float ; z:float}
    type rayon ={ r:float}



    j'ai ecris une fonction translation_sphere ( vecteur->sphere->sphere)

    j'ais le type vecteur

    type vecteur = {x : float; y :float; z: float}


    ce que je voudrais savoir c'est comment implementer ma fonction

    translation_sphere (v:vecteur) sphere

    pour que celle ci face la translation du centre c de la sphere par le vecteur v et renvoie la sphere avec le nouveau centre apres translation c' et le rayon inchangé.


    J'ai pensé a 2 possibilités

    1/ let translation_sphere (v:vecteur) sphere = {translation_point v c; r}

    (j'ai la fonction tranlation_point suivante :

    let translation_point vecteur point = {x= point.x+.vecteur.x;
    y=point.y+.vecteur.y; z=point.z+.vecteur.z}

    2/ let translation_sphere (v:vecteur) sphere = {c=translation_point v c; r}


    Je ne sais pas du tout comment faire , cela ne fonctionne pas quelqu'un peut il me donner une reponse precise svp


    Merci d'avance ! =)

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Alors déjà, les balises CODE, c'est bien, ça nous permet de lire ce que tu as écris.

    Ensuite, tes solutions sont bonnes, à la syntaxe près. Donc en regardant ton cours, tu devrais trouver la bonne syntaxe sans problème.

    Bonne chance

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    oui desolé pour les balise c'est que je suis dans le rush et j'ai oublié !


    mais malheureusement je n'ai pas ça dans mes cours =ss sinon je n'aurais pas posé de question !


    merci encore ! =)

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    sinon je propose aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     let translation_sphere vecteur sphere= {c=translation_point vecteur sphere.c;r=sphere.r}


    qu'en pensez vous ? est-ce enfin LA bonne solution ?


    Merci !!

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Citation Envoyé par 44Magnum Voir le message
    qu'en pensez vous ? est-ce enfin LA bonne solution ?
    C'est en tout cas ce que j'aurais fait

  14. #14
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Salut,

    Je ne sais pas si c'est une bonne idée, ça dépend de ce que tu veux faire de ta fonction "translation" après, mais l'ajout de du mot clef "mutable" devant le champ d'un enregistrement (lors de sa définition) te permet de le rendre modifiable.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # type machin = { mutable a : int } ;;
    type machin = { mutable a : int; }
    # let truc = { a = 0 } ;;
    val truc : machin = {a = 0}
    # truc.a <- 1 ;;
    - : unit = ()
    # truc ;;
    - : machin = {a = 1}

    Du coup ceci te permettrait de réellement "déplacer" ta sphère lorsque tu lui applique "translation", et pas seulement de renvoyer l'image de la sphère par la translation.

    Je pense que ça dépend de ce que tu veux faire après. Par contre je précise que globalement les trucs "mutables" (références, etc...) ne sont pas trop appréciés dans les langages fonctionnels, et que ça me semble moins juste mathématiquement. Donc bon, c'est juste histoire de te signaler que ça existe au cas où tu ne le saurais pas.

  15. #15
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    On a malheureusement pas le droit au "mutable" dans cette partie...
    Si tu veux passer outre, je te conseille de regarder dans "notre" cours, la partie sur les références

    *Merci Bluestorm ^^*

    Je reprends donc le code de 44Magnum qui serait (c'est une question ~~ affirmation ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let translation_sphere (v:vecteur) (sphere:sphere) =
      let resultat = sphere in
        resultat.centre = translation_point (sphere.centre) v ;
        resultat;;
    Tout en ayant les mêmes types que 44Magnum.

    L'interpréteur me renvoie un warning (d'ailleurs ce genre de warning apparaît souvent et je comprends pas le fond du problème...:s) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning S : this expression should have type unit
    resultat.centre = translation_point (sphere.centre) v ;
    La translation du centre de la sphere va forcément me renvoyer autre chose que unit :/

    Merci d'avance.

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    "=" en Ocaml est un test d'égalité, et pas un opérateur d'assignation. Tu essaies de modifier le centre de la sphère, mais ce n'est pas possible si son champs "centre" n'est pas modifiable.

    Vous devriez oublier tout ce qui est mutation (malgré les encouragements au crime de drunkskater qui croit à tort que la connaissance ne peut pas faire de mal) et garder le code proposé par Magnum44:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let translation_sphere vecteur sphere=
      { c = translation_point vecteur sphere.c; r = sphere.r }
    Comme le cas "on renvoie un nouvel enregistrement en remplaçant seulement une partie des champs par d'autres valeurs" arrive souvent en OCaml, il y a même une syntaxe faite exprès pour ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let translation_sphere vecteur sphere=
      { sphere with c = translation_point vecteur sphere.c }

Discussions similaires

  1. data definition has no type or storage class
    Par Almenor dans le forum Débuter
    Réponses: 7
    Dernier message: 11/06/2012, 17h13
  2. Problème rotation PNG (Unknown image type 0)
    Par gostbuster dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/02/2009, 15h03
  3. definition de type non reconnu par g++ ou erreur?
    Par harsh dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 09/06/2006, 01h42
  4. Réponses: 12
    Dernier message: 02/01/2006, 22h24
  5. [SVG] Effectuer une rotation d'un texte type 'tspan'
    Par M4v3rick dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 21/06/2005, 18h33

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