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 :

boost::numeric::ublas::vector pour de la physique


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut boost::numeric::ublas::vector pour de la physique
    Bonjour,

    J'aurais deux questions,

    la première c'est comment différencier les vecteurs classiques du std et ceux de boost en utilisant using namespace pour les deux ?

    par exemple j'ai ça :

    std::vector<string> a;
    boost::numeric::ublas::vector<float> b;
    ______

    question 2, je trouve mon code pas très lisible, je débute avec ce genre de vecteurs pour faire de la physique :

    Quand j'aditionne deux vecteurs en 3D par exemple j'écris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    vector<float> a(3);
    vector<float> b(3);
    vector<float> c(3);
     
    a(0) = 3.2f;
    a(1) = 2.2f;
    a(2) = 1.0f;
     
    b(0) = 3.2f;
    b(1) = 4.5f;
    b(2) = 1.4f;
     
    c = a + b;
    , qui est un peu lourd je trouve et on ne retrouve pas du tout les x, y, z de la physique. Je suis sur qu'on peut écrire plus simplement et qu'il y a un truc qui m'échappe surtout niveau déclaration.

    Merci d'avance

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Créer une classe pour te simplifier la vie en surchargeant les opérateurs que tu as besoin (operator+ dans ton cas)
    Voici le debut:
    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
    #ifndef VECTOR3_HPP
    #define VECTOR3_HPP
     
    #include <ostream>
     
     
    /// Container for 3 value
    template <class T>
    class Vector3
    {
    public:
     
    	/// x
    	T x;
     
    	/// y
    	T y;
     
    	/// z
    	T z;
     
    	/**
             * Constructor
             * @param x
             * @param y
             * @param z
             */
    	explicit Vector3<T>(T const & x=T(), T const & y=T(), T const & z=T()) : x(x), y(y), z(z) { }
     
    	/**
             * Operator ==
             * @param v A Vector3
             * @return true if Vector3 have same values
             */
    	bool operator==(Vector3 const & v) const { return (x == v.x && z == v.z && z == v.z); }
     
    	/**
             * Operator !=
             * @param v A Vector3
             * @return true if Vector3 have different values
             */
    	bool operator!=(Vector3 const & v) const { return (! ((*this) == v)); }
     
    };
     
    /**
     * To put a Vector3 in a flux
     * @param o the flux
     * @param v the Vector3
     * @return the flux
     */
    template <class T>
    std::ostream & operator << (std::ostream & o, Vector3<T> const & v)
    {
    	o << "{" << v.x << ", " << v.y << ", " << v.z << "}";
    	return o;
    }
     
    #endif
    Tu pourras écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Vector3<float> a(3.2, 2.2, 1.0);
    Vector3<float> b(3.2, 4.5, 1.4);
    Vector3<float> c(a + b); // si l'opérateur + entre deux Vector3<T> est écrit

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut Merci
    Je vais faire comme tu dis, je n'avais pas envie de réinventer la roue. Sinon ta solution me semble très bien.

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Les Vector3 sont assez courants, la SFML, Ogre3D et CrystalSpace ont une classe comme celle-ci.
    Je pense que c'est la solution la plus claire.

    Si tu es en C++11, tu peux aussi utiliser les vector de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<float> a({3.2, 2.2, 1.0});
    std::vector<float> b({3.2, 4.5, 1.4});
    et aussi regarder du côté des tuples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::tuple<float, float, float> a(3.2, 2.2, 1.0);
    std::tuple<float, float, float> b(3.2, 4.5, 1.4);
    PS:
    Citation Envoyé par killwin Voir le message
    comment différencier les vecteurs classiques du std et ceux de boost en utilisant using namespace pour les deux ?
    Si tu te poses la question, ne le fais pas
    http://cpp.developpez.com/faq/cpp/?p...PACE_using_std

  5. #5
    Membre éclairé Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Points : 656
    Points
    656
    Par défaut
    Dans ton cas je confirme, si tu peux faire du C++11, utilise les std::tuple je pense que c'est ce qui t'irait le mieux ici.

    @+
    Rémi

  6. #6
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par srvremi Voir le message
    Dans ton cas je confirme, si tu peux faire du C++11, utilise les std::tuple je pense que c'est ce qui t'irait le mieux ici.
    Les tuple sont aussi présent dans Boost
    http://www.boost.org/doc/libs/1_50_0...ers_guide.html

    Par contre je préfère éviter de redéfinir des opérateurs pour des objets de la std. Additionner des points x_y_z, ça va; mais pas pour des std::tuple<T, T, T>.
    On pourrait faire un typedef, mais le type original obtient aussi la définition des opérateurs comme dans cet exemple:
    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
    // g++ -Wall -Wextra -std=c++11 operator_typedef.cpp -o operator_typedef && operator_typedef
     
    #include <iostream>
    #include <tuple>
     
     
    template <class T>
    using x_y_z = std::tuple<T, T, T>;
     
    template <class T>
    x_y_z<T> operator+(x_y_z<T> const & a, x_y_z<T> const & b)
    {
    	return (x_y_z<T>(std::get<0>(a) + std::get<0>(b), std::get<1>(a) + std::get<1>(b), std::get<2>(a) + std::get<2>(b)));
    }
     
    template <class T>
    std::ostream & operator<<(std::ostream & o, x_y_z<T> const & v)
    {
    	o << "{" << std::get<0>(v) << ", " << std::get<1>(v) << ", " << std::get<2>(v) << "}";
    	return o;
    }
     
     
    int main()
    {
    	x_y_z<float> a(3.2, 2.2, 1.0);
    	x_y_z<float> b(3.2, 4.5, 1.4);
     
    	std::cout << "  " << a << std::endl;
    	std::cout << "+ " << b << std::endl;
    	std::cout << "= " << a + b << std::endl;
    	std::cout << std::endl;
     
    	std::tuple<float, float, float> ta(3.2, 2.2, 1.0);
    	std::tuple<float, float, float> tb(3.2, 4.5, 1.4);
     
    	std::cout << "  " << ta << std::endl;
    	std::cout << "+ " << tb << std::endl;
    	std::cout << "= " << ta + tb << std::endl;
    	std::cout << std::endl;
     
    	return 0;
    }
    et sa sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      {3.2, 2.2, 1}
    + {3.2, 4.5, 1.4}
    = {6.4, 6.7, 2.4}
     
      {3.2, 2.2, 1}
    + {3.2, 4.5, 1.4}
    = {6.4, 6.7, 2.4}

Discussions similaires

  1. Métaprogrammation dans boost::numeric::ublas
    Par Kaluza dans le forum Langage
    Réponses: 4
    Dernier message: 07/10/2011, 18h11
  2. JComboBox(Vector) pour remplir les items
    Par une_tite_question dans le forum Composants
    Réponses: 4
    Dernier message: 22/04/2008, 18h19
  3. boost::numeric::ublas matrix.assign( identity_matrix )
    Par Suryavarman dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 19/05/2007, 04h37
  4. boost::numeric::ublas matrix -> opengl
    Par Suryavarman dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 17/05/2007, 16h58
  5. [Vector] Pour 2,...n dimensions ?
    Par FFF dans le forum Langage
    Réponses: 12
    Dernier message: 30/10/2005, 10h16

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