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

C++ Discussion :

Manipulation des vecteurs 3D


Sujet :

C++

  1. #1
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut Manipulation des vecteurs 3D
    Bonsoir,

    Mon code est le suivant:
    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
     
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
     
    typedef string Forme   ;
    typedef string Couleur ;
     
    class Brique
    {
    private:
      Forme   forme   ;
      Couleur couleur ;
     
    public:
    Brique(Forme f, Couleur c)
    {forme=f;
     couleur=c;
    };
    ostream& afficher(ostream& sortie) const {
    	if(couleur.empty()==false){
    	sortie<<"("<<forme<<", "<<couleur<<")";}
    	else{
    	sortie<<forme;}
    	return sortie;
    }
     friend std::ostream& operator <<(std::ostream&, const Brique&); 
    };
    std::ostream& operator <<(std::ostream& Stream, const Brique& Obj){
        Obj.afficher(Stream);
        return Stream; 
    }
    class Construction
    {
      friend class Grader;
      public: vector<vector<vector<Brique>>> contenu;
      public:Construction(Brique b):contenu (1, vector<vector<Brique>>(1,vector<Brique> (1, b))){
      }
      ostream& afficher(ostream& sortie) const {
    		for(int i(0); i < (int)contenu.size(); i++) {
          for(int j(0); j < (int)contenu[i].size(); j++) {
              for(int k(0); k < (int)contenu[i][j].size(); k++) {
                       contenu[i][j][k].afficher(sortie);}}}
        return sortie;
     
    }
    void operator^=(Construction const& b)
      {   
    	  for(int i(0); i < (int)contenu.size(); i++) {
    		  contenu.push_back(b.contenu[i]);
    		  }
     
      }     
     
    };
     std::ostream& operator <<(std::ostream& Stream, const Construction& Obj){
        Obj.afficher(Stream);
        return Stream; 
    }
     
     
    int main()
    {
      // Modèles de briques
      Brique toitD("obliqueD", "rouge");
      Brique toitG("obliqueG", "rouge");
      Brique toitM(" pleine ", "rouge");
      Brique mur  (" pleine ", "blanc");
      Brique vide ("                 ", "");
     
    cout << toitD;
    //Tester Construction 
    Construction c(mur);
    Construction c1(toitD);
    c^= c1;
    cout<< c;
      return 0;
    }
    Mon programme compile bien, mais il se plante au moment de l'exécution..
    J'ai un doute concernant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void operator^=(Construction const& b)
      {   
    	  for(int i(0); i < (int)contenu.size(); i++) {
    		  contenu.push_back(b.contenu[i]);
    		  }
     
      }
    Avez-vous une idée ? Est-ce je dois modifier la taille de "contenu" ?


    Merci d'avance pour votre aide.
    La science ne connaît qu'une loi: la contribution scientifique.

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par chercheur111 Voir le message
    Bonsoir,

    Mon code est le suivant:
    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
     
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
     
    typedef string Forme   ;
    typedef string Couleur ;
     
    class Brique
    {
    private:
      Forme   forme   ;
      Couleur couleur ;
     
    public:
    Brique(Forme f, Couleur c)
    {forme=f;
     couleur=c;
    };
    ostream& afficher(ostream& sortie) const {
    	if(couleur.empty()==false){
    	sortie<<"("<<forme<<", "<<couleur<<")";}
    	else{
    	sortie<<forme;}
    	return sortie;
    }
     friend std::ostream& operator <<(std::ostream&, const Brique&); 
    };
    std::ostream& operator <<(std::ostream& Stream, const Brique& Obj){
        Obj.afficher(Stream);
        return Stream; 
    }
    class Construction
    {
      friend class Grader;
      public: vector<vector<vector<Brique>>> contenu;
      public:Construction(Brique b):contenu (1, vector<vector<Brique>>(1,vector<Brique> (1, b))){
      }
      ostream& afficher(ostream& sortie) const {
    		for(int i(0); i < (int)contenu.size(); i++) {
          for(int j(0); j < (int)contenu[i].size(); j++) {
              for(int k(0); k < (int)contenu[i][j].size(); k++) {
                       contenu[i][j][k].afficher(sortie);}}}
        return sortie;
     
    }
    void operator^=(Construction const& b)
      {   
    	  for(int i(0); i < (int)contenu.size(); i++) {
    		  contenu.push_back(b.contenu[i]);
    		  }
     
      }     
     
    };
     std::ostream& operator <<(std::ostream& Stream, const Construction& Obj){
        Obj.afficher(Stream);
        return Stream; 
    }
     
     
    int main()
    {
      // Modèles de briques
      Brique toitD("obliqueD", "rouge");
      Brique toitG("obliqueG", "rouge");
      Brique toitM(" pleine ", "rouge");
      Brique mur  (" pleine ", "blanc");
      Brique vide ("                 ", "");
     
    cout << toitD;
    //Tester Construction 
    Construction c(mur);
    Construction c1(toitD);
    c^= c1;
    cout<< c;
      return 0;
    }
    Mon programme compile bien, mais il se plante au moment de l'exécution..
    J'ai un doute concernant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void operator^=(Construction const& b)
      {   
    	  for(int i(0); i < (int)contenu.size(); i++) {
    		  contenu.push_back(b.contenu[i]);
    		  }
     
      }
    Avez-vous une idée ? Est-ce je dois modifier la taille de "contenu" ?
    Non, push_back() va le faire pour toi.

    Ceci dit, ce que tu fait est une copie. Je ne vois pas le rapport avec l'opérateur ^=. Si tu souhaite faire une copie, alors un simple contenu = b.contenu suffira (c'est peu élégant, mais ça marchera et tu n'a pas besoin de te préocupper des question de parcours ou de la taille).

    Accessoirement, la boucle devrait plutôt ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (std::size_t i = 0; i < contenu.size(); ++i) {
      ...
    }
    * type de i == std::size_t, pas int. sizeof(std::size_t) n'est pas garanti d'être sizeof(int) et std::size_t n'est pas signé, contrairement à int.
    * ++i au lieu de i++. Bien que ça n'ait que très peu d'impact dans ce cas précis, il est toujours préférable d'utiliser la notation préfixée lorsque c'est possible (on évite une copie dans de très nombreux cas)

    Pendant que j'y suis : tu viens de récupérer un gage absolument horrible (genre "faire 3 fois le tour de monde sur un pied les yeux bandés") pour cette ligne de code, absolument affreuse (et qui va plus que probablement te poser de très, très nombreux problèmes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      public: vector<vector<vector<Brique>>> contenu;
    C'est immonde. Horrible. Impensable. Indicible.

    La punition sera allégée (2 tours du monde) si tu es capable de justifier un tel choix technique.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    BOnsoir,

    Citation Envoyé par chercheur111 Voir le message
    Mon programme compile bien, mais il se plante au moment de l'exécution..
    J'ai un doute concernant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void operator^=(Construction const& b)
      {   
    	  for(int i(0); i < (int)contenu.size(); i++) {
    		  contenu.push_back(b.contenu[i]);
    		  }
     
      }
    TU as un bon feeling, mais es-tu seulement conscient de ce que tu fais là ?
    Tant que tu as un élément dans contenu, tu ajoutes à contenu l'élement i de b.contenu
    ... encore faut-il que b.contenu[i] existe, vu que ça crash, on dirait que non
    remercie le crash qui t'empêche de partir en boucle infini : i < size, j'ajoute un élement (ie: incrément de size), incrément de i; repeat...

    Classiquement l'opérateur ^ est surchargé pour des vector3 pour réaliser le cross-product (produit vectoriel)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Ta boucle est fausse, tu teste la taille de contenu au lieu de la taille de b.contenu.

    Sinon, pour faire ça sans boucle dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu.insert( contenu.end(), b.contenu.begin(), b.contenu.end() );
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Merci Tous pour vos réponses.
    Je suis encore "débutant" avec les vecteurs 3D.. J'essaye de prendre vos remarques en considération ..
    La science ne connaît qu'une loi: la contribution scientifique.

Discussions similaires

  1. Manipulation des vecteurs
    Par dptmt dans le forum MATLAB
    Réponses: 2
    Dernier message: 01/07/2011, 16h03
  2. manipuler des vecteurs
    Par assouma01 dans le forum Langage
    Réponses: 5
    Dernier message: 29/04/2009, 18h36
  3. [STL] Manipuler des vecteurs de vecteur
    Par FabaCoeur dans le forum SL & STL
    Réponses: 6
    Dernier message: 28/04/2007, 20h09
  4. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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