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 :

Vecteur ( mecanique) en 3 Dimensions


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut Vecteur ( mecanique) en 3 Dimensions
    bonjour à tous,

    pour un petit projet qui me permet d'améliorer mes connaissances en c++, j'ai besoin de créer un vecteur à 3 dimensions. En regardant dans le livre de Bjarne Stroustrup, il semblerais que la meilleur solution serait d'utiliser le type valarray.

    Ce que j'aimerais faire c'est de pourvoir créer un nouveau type du style vecteur3d pour créer plus simplement plusieurs vecteur. Cela à fin de pourvoir définir des produit scalaire, vectoriel etc..

    Petite précision, mes vecteur auront des points avec des types différents.


    Alors voila ce que j'ai essayé de faire

    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
     
    // Vecteur.h
    //définition d'un vecteur à 3dimension et qui sera créer et défini par un type T
     
     
    #ifndef VECTEUR
    #define VECTEUR
     
    #include<valarray>
     
    template <T, dim>class Vecteur
    {
    private:
    	std::valarray<T,dim> vecteur3df(dim);
    public:
    	Vecteur();
    	~Vecteur();
     
    };
    #endif
    mais il me marque une erreur de syntaxe.

    De plus dans mon livre préféré, il est marque qu'on peut faire initialiser un valarray grâce à un tableau comme suit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    double point[]={x,y,z};
    std::valarray<double> Vecteur3d(point,3);
    Mais ça ne fonctionne pas non plus.

    Sinon, y a encore des "slice" pour travailler avec des matrices. En gros un tout petit peu perdu, donc si qqn pouvais m'aider à voir un peu plus claire, ce serait sympa!


    Pendant mes recherche, je me pose une question: Boost ne me simplifierais pas la vie pour les opération vectorielles et matricielles?

    A++
    VMFA-2 Sven

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    La déclaration de ta template n'est pas correcte. Il te manque le mot clé typename, et probablement int pour le dim:

    template <typename T, int dim> class Vecteur

    Ensuite: std::valarray<T,dim> vecteur3df(dim);
    C'est pas bon. std::valarray est juste paramétré sur le type T. Il n'y a pas de paramètre pour un "dim". Il te faudrait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::valarray<T> vecteur3df;
    Tu ne peux pas mettre le dim comme tu as mis dans la déclaration de vecteur3df.

    Ensuite, ça c'est bon (si x,y et z) sont convertibles en double:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double point[]={x,y,z};
    std::valarray<double> Vecteur3d(point,3);
    N'oublie pas d'inclure le header pour valarray en début de fichier:

    Pendant mes recherche, je me pose une question: Boost ne me simplifierais pas la vie pour les opération vectorielles et matricielles?
    Oui, du genre uBLAS. std::valarray est assez limité comparé à ce genre de librairie. A toi de voir ce que tu veux faire

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu veux des vecteurs de taille déterminée à la compilation et petite (3). Dans ce cas, je te conseilles d'éviter comme la peste l'allocation dynamique, et donc std::vector ou std::valarray (ce dernier est plus adapté à des calculs matriciels à grande dimention, tout comme boost.ublas ou la plupart des bibliothèques de vecteurs "mathématiques" que tu peux trouver).

    Je te conseillerais donc dans un premier temps de te baser sur un std::tr1::array<T, 3> qui évite l'allocation dynamique (si ton compilateur n'a pas TR1, utilise boost::array, c'est pareil, ou fais le éventuellement toi même, l'important est que la taille est un paramètre template, et qu'il n'y a alors pas besoin d'allocation dynamique).

    Tu auras alors un vecteur tout à fait acceptable.

    Pour avoir un très bon vecteur, il faudrait aller bien plus loin, du côté du template metaprogramming afin d'éviter que du code comme v = v1+v2 ait besoin de 2 boucles for (on peut forcer du déroulement de boucle avec les templates, au cas où le compilateur ne le fasse pas de lui même. Je ne sais pas du tout si les compilateurs classique en font dans ce genre de cas ou pas, le livre c++ template programming (Jossutis/Vandevoorde) décrit ça) et éviter de passer par un variable temporaire (là encore, comme il n'y a pas d'allocation mémoire, c'est moins crucial, mais il y a peut-être des gains à faire). A une époque, il y avait blitz::tinyvector (ou orthographe semblable) qui faisait ce genre de choses, mais ce n'est plus disponible, et je ne sais pas si un remplaçant existe.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut
    Merci de votre aide. c'est sympa. Et puis je vais voir ce que je peux en tirer de boost pour régler ce petit problème. Je marque le sujet comme résolu. Mais je posterais le code une fois que j'aurais trouvé pour les suivants.

    Merci encore.

  5. #5
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Pourquoi s'embêter en mettant le nombre de dimension variable si tu n'en veut toujours que 3 ?
    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
    template<class T>
    class Vecteur
    {
    public :
     
        // Les constructeurs...
        Vecteur();
     
        // Les opérateurs...
     
    private :
     
        // Les composantes, soit :
        T x;
        T y;
        T z;
     
        // ... soit (et là tu peux même utiliser un paramètre template
        // si tu veux un vecteur à N dimensions) :
        T coords[3];
    };

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut
    voila, je me suis beaucoup documenté et cherché sur le stutoriel. j'ai bien avancé,; mais il me reste une toute petite erreur dans mon code que j'arrive pas à régler.

    D'abord le code :

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    namespace CRB
    {
    	namespace TLS
    	{
    		template<class type_donnee, unsigned long taille>
    		class Vecteur
    		{
    		public:
    			typedef Vecteur<type_donnee,taille> Self; //le vecteur même
    			typedef type_donnee TypeDeDonnee;
     
    			enum
    			{
    				statictaille = taille
    			};
     
    			typedef TypeDeDonnee* VecteurType;
     
    			typedef TraitementTypeDeDonnee<TypeDeDonnee> traitement_donnee;
     
    			typedef TypeDeDonnee* pointer;
     
    			Vecteur(void)
    			{
    			}
     
    			//constructeur initialise tt le vecteur à valeur_initiale
    			Vecteur(TypeDeDonnee valeur_initiale)
    			{
    				for (unsigned int i = 0; i < taille(); ++i)
    				{
    					(*this)(i) = valeur_initiale;
    				}
    			}
     
    			//Constructeur de copie. initiale avec un autre vecteur
    			Vecteur(const Self& autre)
    			{
    				for(unsigned int i=0;i<taille;++i)
    				{
    					(*this)(i)=autre(i);
    				}
    			}
     
     
    			//Construit le vecteur à partir d'un tableau
    			Vecteur(const TypeDeDonnee* tableau)
    			{
    				for(unsigned int i=0; i<taille;++i)
    				{
    					(*this)(i)=tableau[i];
    				}
    			}
     
    			unsigned long taille() const
    			{
    				return taille;
    			}
     
    			TypeDeDonnee& operator()(unsigned long i)
    			{
    				assert(i < taille());
    				return mVecteur[i];
    			}
     
    			TypeDeDonnee operator()(unsigned long i) const
    			{
    				assert(i < height());
    				return mVecteur[i];
    			}
     
    			Self& operator=(const TypeDeDonnee nouv_val)
    			{
    				for (unsigned int i = 0; i < height(); ++i)
    				{
    					(*this)(i) = nouv_val;
    				}
    				return (*this);
    			}
     
    			Self& operator=(const Self& nouv_val)
    			{
    				for (unsigned int i = 0; i < height(); ++i)
    				{
    					(*this)(i) = nouv_val(i);
    				}
    				return (*this);
    			}
     
    			const TypeDeDonnee* get() const
    			{
    				return &mVecteur[0];
    			}
     
    			TypeDeDonnee* get()
    			{
    				return &mVecteur[0];
    			}
     
    			Self& normer()
    			{
    				TypeDeDonnee norm = std::sqrt(norm2(*this));
    				for (int i=0; i<taille();++i)
    				{
    					(*this)(i) /= norm;
    				}
    				return (*this);
    			}
    protected:
    	TypeDeDonnee mVecteur[taille];
     
    		};
    	}
    }
    L'erreur à lieu quand j'essaie de construire un vecteur. il me dit qu'il s'attend à avoir un const dans taille, et que construire un tableau de taille 0 est impossible. le truque c'est que mVecteur fait référence un CRB::TLS::Vecteur<type_donnee,0>TypeDeDonnee...... et je ne voie pas d'où viens ce zero. Normalement il devrait être défini par CRB::TLS::Vecteur<type_donnee,taille>::TypeDeDonnee ...... non??

    pour TypeDeDonnee :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class TypeDeDonnee>
    struct TraitementTypeDeDonnee
    {
    };

    En mode debug, j'obtiens ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Compilation en cours...
    EngineTest.cpp
    Ray.cpp
    D:\Cerberus\Cerberus V.0.0.2\Trunks\tools/Vecteur.h(121) : error C2057: expression constante attendue
            D:\Cerberus\Cerberus V.0.0.2\Trunks\CerberusMain\include\Ray.h(14) : voir la référence à l'instanciation de la classe modèle 'CRB::TLS::Vecteur' en cours de compilation
            with
            [
                type_donnee=CRB::DataType,
                taille=3
            ]
    D:\Cerberus\Cerberus V.0.0.2\Trunks\tools/Vecteur.h(121) : warning C4200: extension non standard utilisée : tableau de taille zéro dans un struct/union
            Impossible de générer un constructeur de copie ou un opérateur pour l'assignation de copie lorsque UDT contient un tableau de taille zéro
    D:\Cerberus\Cerberus V.0.0.2\Trunks\CerberusMain\include\Ray.h(15) : error C2229: class 'CRB::Ray' a un tableau de taille zéro non conforme
    Génération de code en cours...
    Ca doit sans doute être une bête erreur, mais je débute en programmation générique, soyez indulgent

    Si vous avez besoin de plus de code, n'hésitez pas!

    please help

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

Discussions similaires

  1. Réduire la taille d'un vecteur de très grande dimension
    Par camboui dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 07/06/2017, 13h23
  2. Vecteur de tableau à 2 dimensions
    Par Gregoire31 dans le forum C++
    Réponses: 7
    Dernier message: 19/12/2011, 15h01
  3. Mise en correspondance entre vecteurs de même dimension
    Par mobi_bil dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 12/03/2009, 22h56
  4. Sorte de tableau a 2 dimension avec un vecteur
    Par undercrash dans le forum SL & STL
    Réponses: 7
    Dernier message: 10/10/2007, 11h52
  5. [math] somme de plusieurs vecteurs à 3 dimensions
    Par teska dans le forum Mathématiques
    Réponses: 5
    Dernier message: 04/06/2003, 21h40

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