begin process at 2012 05 27 14:33:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CLASSE DE VECTEURS EN 2D / 3D PORTABLE, UTILISATION POUR SIMULATIONS PHYSIQUES

CLASSE DE VECTEURS EN 2D / 3D PORTABLE, UTILISATION POUR SIMULATIONS PHYSIQUES


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :vecteur, classe, 2d, 3d Niveau :Débutant Date de création :27/11/2003 Date de mise à jour :30/09/2006 19:48:33 Vu / téléchargé :7 054 / 258

Auteur : Kirua

Ecrire un message privé
Site perso
Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
J'ai utilisé cette classe de vecteurs dans plusieurs simulations physiques (cinétiques surtout, physique classique de Newton et Co). L'aspect graphique était géré en OpenGL, mais la classe en elle-même est absolument indépendante de TOUT. Je n'ai rien utilisé de spécial: je n'ai utilisé que iostream pour la fonction de débuggage console, si on l'enlève on peut aussi enlever l'utilisation de la STD. Et puis j'ai aussi inclus math.h, en écrivant à côté les fonctions que j'ai utilisées, donc si vous ne voulez pas utiliser math.h, il vous suffit de réécrire ces fonctions, et tout marchera!

NOTE: le screenshot provient d'une simulation de collisions non-élastiques, les segments colorés sont les vecteurs vitesse des billes

ATTENTION GRANDE MISE A JOUR DU 5 MAI 2005:
-------------------------------------------- ------------------
je remplace le code (dégueulasse et informe) que j'avais posté ici (quelle daube :/) et je le remplace par deux nouvelles classes écrites récemment, et au passage, vous avez la version 2D et la version 3D. c'est doublement templaté, mais je vous suggères de garder les types proposés dans les 3 typedefs de bas de fichier: V3Di V3Df V3Dd et V2Di V2Df V2Dd. i = int, f = float, d = double.

pas mal de fonctions ont été ajoutées, et puis surtout c'est plus propre ^^

Edit du 30 septembre: correction d'un bug pour GetAngle et ajout des "const" pour les méthodes concernées

Source

  • //------------------------------------------------------------------------------
  • #ifndef CVECTEUR2D_H
  • #define CVECTEUR2D_H
  • //écrit par Kirua - nicolasboumal@hotmail.com
  • //------------------------------------------------------------------------------
  • #include <cmath> //pour la fonction hypot() (renvoie la racine carrée de la somme des carrés des 2 paramètres)
  • //------------------------------------------------------------------------------
  • //Explication: le premier paramètre (T) est le type des coordonnées. Pour un point de l'écran, on voudra
  • //des int, mais pour un point de l'espace, on préférera float ou même double. Le second paramètre (S)
  • //indique le type à utiliser pour effectuer les calculs intermédiaires. Il est recommandé d'utilisé un
  • //type plus précis (par défaut, double) afin d'éviter les pertes trop importantes liées aux arrondis.
  • template<typename T, typename S = double>
  • class CVecteur2D
  • {
  • public:
  • CVecteur2D() : x(0), y(0) {}
  • CVecteur2D(T _x, T _y) : x(_x), y(_y) {}
  • CVecteur2D(const CVecteur2D& V) { x = V.x; y = V.y; };
  • T x, y;
  • S GetModule() const {return S(hypot(y,x));}
  • void SetModule(S m) { S M = GetModule(); x = T(x*m/M); y = T(y*m/M); }
  • S GetAngle() const { return S(atan2(y, x)); }
  • CVecteur2D operator+ (const CVecteur2D& V) const {return CVecteur2D(x+V.x, y+V.y);}
  • CVecteur2D operator- (const CVecteur2D& V) const {return CVecteur2D(x-V.x, y-V.y);}
  • CVecteur2D operator* (const S R) const {return CVecteur2D(T(x*R), T(y*R));}
  • CVecteur2D operator/ (const S R) const {return CVecteur2D(T(x/R), T(y/R));}
  • S operator* (const CVecteur2D& V) const {return x*V.x + y*V.y;}
  • CVecteur2D& operator+=(const CVecteur2D& V) {x += V.x; y += V.y; return *this;}
  • CVecteur2D& operator-=(const CVecteur2D& V) {x -= V.x; y -= V.y; return *this;}
  • CVecteur2D& operator*=(const S R) {x = T(S(x) * R); y = T(S(y) * R); return *this;}
  • CVecteur2D& operator/=(const S R) {x = T(S(x) / R); y = T(S(y) / R); return *this;}
  • bool operator==(const CVecteur2D& V) const {return (x == V.x && y == V.y);}
  • bool operator!=(const CVecteur2D& V) const {return (x != V.x || y != V.y);}
  • };
  • //------------------------------------------------------------------------------
  • typedef CVecteur2D<int> V2Di;
  • typedef CVecteur2D<float> V2Df;
  • typedef CVecteur2D<double> V2Dd;
  • //------------------------------------------------------------------------------
  • #endif
  • //------------------------------------------------------------------------------
  • Et la classe 3D:
  • //------------------------------------------------------------------------------
  • #ifndef CVECTEUR3D_H
  • #define CVECTEUR3D_H
  • //écrit par Kirua - nicolasboumal@hotmail.com
  • //------------------------------------------------------------------------------
  • #include <cmath>
  • //------------------------------------------------------------------------------
  • template<typename T, typename S = double>
  • class CVecteur3D
  • {
  • public:
  • CVecteur3D() : x(0), y(0), z(0) {}
  • CVecteur3D(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}
  • CVecteur3D(const CVecteur3D& V) { x = V.x; y = V.y; z = V.z; }
  • T x, y, z;
  • S GetModule() const { return S(sqrt(x*x + y*y + z*z)); }
  • void SetModule(S m) { S M = GetModule(); x = T(x*m/M); y = T(y*m/M); z = T(z*m/M); }
  • CVecteur3D operator+ (const CVecteur3D& V) const {return CVecteur3D(x+V.x, y+V.y, z+V.z);}
  • CVecteur3D operator- (const CVecteur3D& V) const {return CVecteur3D(x-V.x, y-V.y, z-V.z);}
  • CVecteur3D operator* (const S R) const {return CVecteur3D(T(x*R), T(y*R), T(z*R));}
  • CVecteur3D operator/ (const S R) const {return CVecteur3D(T(x/R), T(y/R), T(z/R));}
  • S operator* (const CVecteur3D& V) const {return x*V.x + y*V.y + z*V.z;}
  • CVecteur3D& operator+=(const CVecteur3D& V) {x += V.x; y += V.y; z += V.z; return *this;}
  • CVecteur3D& operator-=(const CVecteur3D& V) {x -= V.x; y -= V.y; z -= V.z; return *this;}
  • CVecteur3D& operator*=(const S R) {x = T(S(x) * R); y = T(S(y) * R); z = T(S(z) * R); return *this;}
  • CVecteur3D& operator/=(const S R) {x = T(S(x) / R); y = T(S(y) / R); z = T(S(z) / R); return *this;}
  • bool operator==(const CVecteur3D& V) const {return (x == V.x && y == V.y && z == V.z);}
  • bool operator!=(const CVecteur3D& V) const {return (x != V.x || y != V.y || z != V.z);}
  • //produit croisé (cross product, produit vectoriel)
  • CVecteur3D operator^ (const CVecteur3D& V) const {return CVecteur3D(y*V.z - z*V.y, z*V.x - x*V.z, x*V.y - y*V.x);}
  • CVecteur3D& operator^= (const CVecteur3D& V) {x = y*V.z - z*V.y; y = z*V.x - x*V.z; z = x*V.y - y*V.x; return *this;}
  • };
  • //------------------------------------------------------------------------------
  • typedef CVecteur3D<int> V3Di;
  • typedef CVecteur3D<float> V3Df;
  • typedef CVecteur3D<double> V3Dd;
  • //------------------------------------------------------------------------------
  • #endif
  • //------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#ifndef CVECTEUR2D_H
#define CVECTEUR2D_H
//écrit par Kirua - nicolasboumal@hotmail.com
//------------------------------------------------------------------------------
#include <cmath>    //pour la fonction hypot() (renvoie la racine carrée de la somme des carrés des 2 paramètres)
//------------------------------------------------------------------------------
//Explication: le premier paramètre (T) est le type des coordonnées. Pour un point de l'écran, on voudra
//des int, mais pour un point de l'espace, on préférera float ou même double. Le second paramètre (S)
//indique le type à utiliser pour effectuer les calculs intermédiaires. Il est recommandé d'utilisé un
//type plus précis (par défaut, double) afin d'éviter les pertes trop importantes liées aux arrondis.
template<typename T, typename S = double>
class CVecteur2D
{
    public:
        CVecteur2D() : x(0), y(0) {}
        CVecteur2D(T _x, T _y) : x(_x), y(_y) {}
        CVecteur2D(const CVecteur2D& V) { x = V.x; y = V.y; };
    
        T x, y;
        
        S GetModule() const {return S(hypot(y,x));}
        void SetModule(S m) { S M = GetModule(); x = T(x*m/M); y = T(y*m/M); }
        
        S GetAngle() const { return S(atan2(y, x)); }
        
        CVecteur2D  operator+ (const CVecteur2D& V) const {return CVecteur2D(x+V.x, y+V.y);}
        CVecteur2D  operator- (const CVecteur2D& V) const {return CVecteur2D(x-V.x, y-V.y);}
        CVecteur2D  operator* (const S R) const {return CVecteur2D(T(x*R), T(y*R));}
        CVecteur2D  operator/ (const S R) const {return CVecteur2D(T(x/R), T(y/R));}
        S           operator* (const CVecteur2D& V) const {return x*V.x + y*V.y;}
        CVecteur2D& operator+=(const CVecteur2D& V) {x += V.x; y += V.y; return *this;}
        CVecteur2D& operator-=(const CVecteur2D& V) {x -= V.x; y -= V.y; return *this;}
        CVecteur2D& operator*=(const S R) {x = T(S(x) * R); y = T(S(y) * R); return *this;}
        CVecteur2D& operator/=(const S R) {x = T(S(x) / R); y = T(S(y) / R); return *this;}
        bool        operator==(const CVecteur2D& V) const {return (x == V.x && y == V.y);}
        bool        operator!=(const CVecteur2D& V) const {return (x != V.x || y != V.y);}
};
//------------------------------------------------------------------------------
typedef CVecteur2D<int>    V2Di;
typedef CVecteur2D<float>  V2Df;
typedef CVecteur2D<double> V2Dd;
//------------------------------------------------------------------------------
#endif
//------------------------------------------------------------------------------




Et la classe 3D:



//------------------------------------------------------------------------------
#ifndef CVECTEUR3D_H
#define CVECTEUR3D_H
//écrit par Kirua - nicolasboumal@hotmail.com
//------------------------------------------------------------------------------
#include <cmath>
//------------------------------------------------------------------------------
template<typename T, typename S = double>
class CVecteur3D
{
    public:
        CVecteur3D() : x(0), y(0), z(0) {}
        CVecteur3D(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}
        CVecteur3D(const CVecteur3D& V) { x = V.x; y = V.y; z = V.z; }
    
        T x, y, z;
        
        S GetModule() const { return S(sqrt(x*x + y*y + z*z)); }
        void SetModule(S m) { S M = GetModule(); x = T(x*m/M); y = T(y*m/M); z = T(z*m/M); }
        
        CVecteur3D  operator+ (const CVecteur3D& V) const {return CVecteur3D(x+V.x, y+V.y, z+V.z);}
        CVecteur3D  operator- (const CVecteur3D& V) const {return CVecteur3D(x-V.x, y-V.y, z-V.z);}
        CVecteur3D  operator* (const S R) const {return CVecteur3D(T(x*R), T(y*R), T(z*R));}
        CVecteur3D  operator/ (const S R) const {return CVecteur3D(T(x/R), T(y/R), T(z/R));}
        S           operator* (const CVecteur3D& V) const {return x*V.x + y*V.y + z*V.z;}
        CVecteur3D& operator+=(const CVecteur3D& V) {x += V.x; y += V.y; z += V.z; return *this;}
        CVecteur3D& operator-=(const CVecteur3D& V) {x -= V.x; y -= V.y; z -= V.z; return *this;}
        CVecteur3D& operator*=(const S R) {x = T(S(x) * R); y = T(S(y) * R); z = T(S(z) * R); return *this;}
        CVecteur3D& operator/=(const S R) {x = T(S(x) / R); y = T(S(y) / R); z = T(S(z) / R); return *this;}
        bool        operator==(const CVecteur3D& V) const {return (x == V.x && y == V.y && z == V.z);}
        bool        operator!=(const CVecteur3D& V) const {return (x != V.x || y != V.y || z != V.z);}
        
        //produit croisé (cross product, produit vectoriel)
        CVecteur3D  operator^  (const CVecteur3D& V) const {return CVecteur3D(y*V.z - z*V.y, z*V.x - x*V.z, x*V.y - y*V.x);}
        CVecteur3D& operator^= (const CVecteur3D& V) {x = y*V.z - z*V.y; y = z*V.x - x*V.z; z = x*V.y - y*V.x; return *this;}
};
//------------------------------------------------------------------------------
typedef CVecteur3D<int>    V3Di;
typedef CVecteur3D<float>  V3Df;
typedef CVecteur3D<double> V3Dd;
//------------------------------------------------------------------------------
#endif
//------------------------------------------------------------------------------

 Conclusion

Si vous trouvez des erreurs / incohérences ... ou si vous avez des suggestions: postez joyeusement.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

05 mai 2005 17:58:39 :
Remplacement total du code par deux nouvelles classes templatées de bien meilleure qualité (ça je peux le dire, maintenant, reste à savoir si le nouveau code vaut qq ch ^^).
05 mai 2005 18:02:03 :
Remplacement du zip par le nouveau code.
30 septembre 2006 19:38:46 :
Modification d'une ERREUR: la fonction GetAngle de la classe CVecteur2D appelait atan2 avec les mauvais arguments: c'est y puis x, et non l'inverse. Mettez vos codes à jour si vous avez utilisé cette classe ... De plus, j'ai rajouté les "const" pour les méthodes utiles (+ - * / == != et ^ + GetAngle et GetModule).
30 septembre 2006 19:48:33 :
Correction d'une bêtise dans le texte de présentation ^^.

 Sources du même auteur

Source avec Zip Source avec une capture PARTICLE ENGINE 2D OPENGL DEV-C++ - EFFETS DE FEU ETC [ MOTE...
Source avec Zip DÉFI CHIFFRES DES CHIFFRES ET DES LETTRES, IA RECHERCHE EN P...
Source avec Zip Source avec une capture SIMULATION DE LA GRAVITATION SELON NEWTON (OPENGL / DEVC++)
Source avec Zip Source avec une capture SNAKE 3D OPENGL DEV C++
Source avec Zip Source avec une capture TEMPS DEPUIS LE DÉMARRAGE DE WINDOWS

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MAILLAGE 3D (VTK + QT) par ammoun007
Source avec Zip Source avec une capture BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR U... par envi33
Source avec Zip OPENGL: CLASSE CAMERA QUI GÈRE LE GLULOOKAT par acx01b
TABLEAU 3D GÉNÉRIQUE par xkamen
Source avec Zip Source avec une capture MOTEUR 3D ISOMÉTRIQUE EN OPENGL par Mattpbem

Commentaires et avis

Commentaire de Kirua le 27/11/2003 17:43:01

arf, la présentation du code sur le site est frustrante...
chez moi (sous DevC++) tout est bien aligné, c'est propre, c'est clair, ici les lignes sont toutes coupées dans leur élan et du coup on comprend plus rien :-(
je vous encourage a lire le code avec votre éditeur favoris.

Commentaire de Funto66 le 28/11/2003 00:10:23

Tu devrais poster les simulations avec ;)
Je dirais juste que tu devrais mettre certaines méthodes inline, les GetX()...etc
Sinon, que dire, je connaissais déjà, et c'est du code clair comme d'hab ;)

Commentaire de Kirua le 28/11/2003 08:00:41

les méthodes implentée directement dans la déclaration de la classe sont automatiquement inline, c'est la norme :-)

pout les simulations, on en a déjà parlé lol. celle de collisions de billes j'ai dû bidouiller et du coup le code est légèrement pas beau à un certain endroit. celle de gravitation mon prof de physique m'a dit qu'on ne pouvait pas simuler la gravitation. j'ai pas trop compris pq, mais il dit que ce sera pas juste. et celle de ballistique, j'ai pas soigné la présentation, ceci dit... les résultats sont parfaitement corrects.

Commentaire de Funto66 le 28/11/2003 18:22:53

Tiens, je savais pas que c'était la norme ! On en apprend tous les jours :)
Pour tes simulations, fais comme tu veux, moi je les aurais mises en une seule source, un truc genre "Simulations physiques", mais tu fais comme tu veux ;)
Et puis, je pense pas que la qualité du code soit déplorable, y'a bien pire sur le site, comme.....moi :p

Commentaire de AmK le 30/11/2003 09:31:45

moi je donne 10/10 parceque je trouve qu'elle est trés bien faite , et que en plus elle a été ecrite dans le but d'une réutilisation ( je sais c'est le but meme d'une classe :)) donc vraiment cool !

Commentaire de Kirua le 30/11/2003 14:30:35

merci AmK, et je confirme, elle est réellement volatile cette classe, je l'ai utilisée pour plusieurs projets différents, aucun problème.

Commentaire de soumpro le 23/02/2004 10:43:20

Non , Nico , je suis desolé !
Ca ne marche pas !
J'ai pourtant tout essayé !
Je t'assure !
GCC !

Commentaire de Kirua le 23/02/2004 14:20:11

yves, montre moi ton code.
est-ce que tu as bien pris soin de créer des objets statiques et pas dynamiques?

en fait, tu ne peux pas créer d'objets de cette façon:
Vecteur *vec = new Vecteur();

tu es obligé d'utiliser la façon statique:
Vecteur vec;

un de ces jours, je m'arrangerai pour évacuer le problème, je vais t'avouer que n'en ayant pas eu besoin ds l'immédiat je n'ai pas cherché plus loin.

Commentaire de thecanapit le 26/02/2004 01:31:00

Ouais ta classe est belle mais vire
using namespace std;
C'est inutile et pas standard tu encombres le namespace (pour moi c'est criminel heureusement que je ne suis pas juge :P)

et plusieur fois tu fais en 4 lignes ce qui tient en une seule exemple :
Vecteur  Vecteur::operator* (const float &facteur)
{
/*float x, y;
x = X * facteur;
y = Y * facteur;
return Vecteur(x, y);

mettre ceci :
*/
return Vecteur(X * facteur, Y * facteur);
}

Voila c'est plus lisible et je dis rien pour les fonctions "inline" moi j'aime pas ça mais bon ya les 2 écoles c'est vrai...

Pour ton coup du statique ou dynamique ça vient du fait que ton constructeur n'est pas terrible!!!
Evite les constructeur()!!! c'est pas beau

Dans ton cas tu n'as besoi que d'un constructeur
Vecteur(float x=0.0, float y=0.0);

Et on gagne encore en lisibilité et comacité!!!

Sinon joli boulot continue comme ça tu vas devenir une bete!

Commentaire de Kirua le 26/02/2004 01:41:01

euh, bon, je réponds dans le désordre:

pour les constructeurs, ils sont tout nécessaires. le constructeur par défaut pour remplir un conteneur standard avec des vecteurs nuls, le constructeur que tu évoquais (float x, float y), et puis le constructeur de copie. ce dernier est parfaitement nécessaire pour les conteneurs de nouveau. je suis assez fan de la STL tu remarqueras donc pas touche ;-)

pour le using namespace std, ça ne surcharge rien du tout! je précise au compilo que j'utilise les membres de cet espace de nom sans préfixer chaque élément de std:: (ça deviendrait vite lourd)
y a tt un laius à ce propos sur le tuto de Casteyde. de plus, je doute que je puisse me passer de le mentionner, comment le compilo est-il sensé deviner que je bosse ds un espace de nom?

pour les 4 lignes en une tu as tout à fait raison, pourtant d'habitude j'ai un style assez condensé. ça doit venir du fait que j'ai tripatouillé pas mal avant de trouver la bonne version pour surcharger les opéros.

les inline améliorent les performances si on les utilise à bon escient, pourquoi s'en priver?


c marrant, qd j'ai lu ton message j'ai eu l'impression d'entendre un vétéran du C parler, je me trompe? tu m'as pas l'air très porté sur l'Orienté Objet. je peux me tromper bien sûr mais... y a qq remarques incompatibles avec une pratique "pure" de l'OO :-)

Commentaire de thecanapit le 26/02/2004 01:44:04

Ouais encore un truc :
bool Vecteur::operator!= (const Vecteur &vec)
{
return !( (*this) == vec );
}

C'est plus joli...
J'arrete sinon tu vas dire que je pinaille

Commentaire de Kirua le 26/02/2004 01:47:26

c'est plus joli mais c'est moins performant.

le code actuel:

bool Vecteur::operator!= (const Vecteur &vec)
{
return ( (X != vec.GetX()) || (Y != vec.GetY()) );
}

si la première condition (sur X) est "réussie" (càd que X et vec.GetX st différents), la deuxieme condition n'est même pas évaluée, alors que si on retourne l'inverse de l'opéro d'égalité, il faut de tte façon tester les deux conditions (puisque relation logique &&, et pas || comme ici), et en plus il faut inverser le booléen. c'est un rikiki, mais c tellement simple de l'épargner :-)

Commentaire de thecanapit le 26/02/2004 04:39:51

Bien entendu il fallait conserver le constructeur par recopie... Abus de langage de ma part.

Pour le using namespace std, ça ne surcharge rien du tout! je précise au compilo que j'utilise les membres de cet espace de nom sans préfixer chaque élément de std:: (ça deviendrait vite lourd)

Tu fais bien de rappeler ces choses élémentaires bcp de gens qui viennent ici écrivent cette ligne sans se poser de question...
Bref moi je suis fan de Bjarne Stroustroup c'est ma bible et lui il fait pas comme ça. Il a d'ailleurs aussi fait un laius dessus dans son bouquin.
Ok c'est lourd encore que on s'y fait et quand tu programmes vraiment sur des gros projets il faut respecter la norme.

Je suis d'accord mes modifs sont légèrement moins performantes (un appel de fonction en plus) mais plus lisbles... bon c'est vrai tu en fais ce que tu veux. Moi j'aime quand c'est condensé.

Ta discussion sur le théoreme de Morgan appliqué à la prog est bien. Moi j'ai l'habitude de n'utilise que les && pour etre sur que tous les test sont effectué... C'est le style de chacun qui s'exprime.

J'ai aussi viré de la classe les fonctions de conversion en deg et radian... Elles n'ont pas grand de rapport direct avec ta classe Vecteur. Je veux dire par la qu'elles sont plus générales que de simples vecteurs donc pour moi elle n'ont pas à y etre.

Je pense que tu pourrais rajouter une fonction d'angle dans ton .h :
extern float angle(float x, float y);//l'angle entre deux points entre -PI et +PI (0 si x=0)

dans le .cpp ça donne :
float angle(float x, float y)
{
float a=x ? (float)atan(y/x) : 0;
if (y&lt;0) if (x&gt;=0) return a + PI;
else return a- PI;

return a;
}

Comme ça tu peux rajouter une fonction membre à ta classe Vecteur :

float theta() const; //retourne l'angle du vecteur;

et l'implémenter :
float Vecteur::theta() const
{
return angle(getX(),getY());
}

Vétéran du C?! bof j'en ai fait une année et ça m'a saoulé quand l'an dernier j'ai découvert C++. Depuis je récite 1 C++ programming tous les soirs ;)

Pour en terminer avec les modif que j'ai fait à ton code, j'ai rajouté une fonction d'affichage.
friend std::ostream& operator&lt;&lt;(std::ostream& os, const Vecteur& vec);

et PI je l'ai mis en
const float  PI =3.14159265f;
Comme ça je suis sur qu'il n'est pas converti en double...

Je ferai parler la poudre à GCC demain (le putain de modem qu'on m'a preté n'est pas reconnu sur ma debian et j'ai pas envie de rebooter sous linux car faut que trace j'ai pas fini mon projet...)

a+ et fait gaffe c'est bientot les concours. Faut etre en forme et pas se coucher aussi tard lol!

Commentaire de Kirua le 26/02/2004 14:48:48

le mot clef using occupe plusieurs pages dans le tuto de Casteyde (qui est aussi dans une certaine mesure une référence, M Casteyde si tu m'écoutes ;)), et fait parfaitement partie de la norme. je n'ai jamais créé de variable 'int cout', je ne risque pas d'avr de problème de conflit. je comprends bien ton pt de vue, mais pr moi, un code source doit être ... beau. ouais voilà je l'ai dit :-D et donc std:: surcharge.


je comprends bien la volonté de faire une inversion de operator==, si un jour cet opérateur devait changer, il ne faudrait pas modifier operator!=, c'est pratique. ceci dit, je ne sais plus quand M Chasles est mort, mais je pense que la probabilité pour que le test de comparaison de deux vecteurs change est quasi nul ;-)

si tu n'utilises que des AND, je ne vois pas comment tu peux programmer sans te sentir coincé... les OR et les XOR sont très utiles, comment t'en sors-tu? (au passage, je savais pas que ça s'appelait le théorème de morgan, je retiens ^^ vu le sujet, ça doit être une théorie de math discrètes, non?)

en fait, les fonctions de conversions RadToDeg et DegToRad j'aurais dû les déclarer en static, et public. ça aurait été bcp plus logique, mais à l'époque (sic), je ne connaissais pas bien le principe de méthode/propriété "static". Ceci dit, j'insiste pour que ces deux méthodes restent membres de la classe Vecteur, elles sont indispensables.

pour les angles, je vois pas où tu veux en venir, j'ai une fonction GetDirection ou GetOrientation, me souviens plus du nom. c'est exactement cela qu'elle fait. (au passage, je vois que tu n'oublies pas de préciser les 'const', faudrait que je m'applique à les placer moi aussi)

tu as le book de bjarne alors, tu l'as en quelle langue? (je sais pas s'il a été traduit). tu pourrais me donner ton avis dessus?

les concours? il va enfin y avr un concours de C++? :-) (et plus une saloperie de .NET ... ahum, dsl)

pour la déclaration de PI tu as bien raison, saleté d'habitude...

quant à l'heure du couché, tu m'as dépassé de bcp ^^ j'étais fatigué hier soir, mais une prochaine fois on discutera jusque 3h, c'est mon heure. merci bcp d'avr répondu aussi largement, ça fait bien plaisir. est-ce que je dois comprendre que tu utilises ma classe dans u nde tes projets ?

Commentaire de thecanapit le 26/02/2004 23:57:48

ok... std tu fais comme tu sens. Je pense que cela se joue plutot au niveau de l'echelle de ton. Un tres gros projet ça m'étonnerait que les autres développeur tolère que chacun utile son namespace perso.

Justement pour l'opérateur ==!!! si celui ci vient à changer dans le futur je n'aurai que == à modifier! l'opérateur != doit etre vu comme la négation de == donc il faut inverser l'opérateur ==. Ouais c'est difficile de sentir la subtilité mais le C++ c'est ça... Le raffinement jusqu'au bout du code!

Pour le théoreme de morgan je te renvoie sur ce que m'a donné google:
http://www.citylinks.ch/pages/electro/electro8a.html
Vers la bas il y a un rappel sur l'algèbre de boole.
MORGAN en c'est :
!(a+b) = !a . !b
!(a.b) = !a+!b
Remplacer "+" par "OU" et "." par "AND" pour les electroniciens. Les math dicrete ce sont les suites et c'est beaucoup plus gore que cette bidouille LOL.

Non je vois pas vraiment l'interet du static... En fait pour faire dans les regles de l'art moi j'aurais spécialisé ta classe Vecteur en une classe Point dans lequel j'aurai mis la fonction qui me renvoie l'angle entre 2 point. Comme je suis fégnant je l'ai mise en tant que fonction de service. Dans certaine lib il regroupe ça sous forme d'un namespace aussi... On touche la les limites de mes connaissances en C++. Il y a plein de solutions possibles, moi j'utilise celle qui me parait la plus élégante à mon goût.

GetDirection ou orientation ça ma paru trop long et compliqué donc je l'ai viré. Il y a certain truc que je ne connaissais pas comme ComposanteDirigee. Le C++ c'est fait pour etre lisible. Cela doit se rapprocher des math le plus possible si tu modélises une formule de math.

Pour la projection j'ai aussi rajouté une fonction membre qui me renvoie le vecteur unitaire de mon object Vecteur. Comme ça j'ai l'impression de lire une formule d'electromag :)

le C++ de BS est la référence ultime (voila pour mon avis) un peu comme le kernighan et richie pour le C. D'ailleurs ils se connaissent bien ces 3.
Je te le file sur mon bordel : http://www.linux.efrei.fr/~pontoize/Prog/
Je déconseille de commencer par ce bouquin quand on découvre le C++ mais tu es bon donc fonce.
Un autre champion toute catégorie c'est Herb Sutter :
http://www.gotw.ca/

Bien sur que j'utilise ta classe, elle est bien mais je l'ai tunnée à ma façon!!! J'aime pas partir from scratch moi je suis un mec aware et fénéant. J'ai conservé tes bonnes idées et j'ai rajouté des trucs à ma sauce. Je te file ce que j'ai fait si tu veux... En fait j'ai été déçu par gmp je pensais que je trouverai mon bonheur la dedans mais je n'y ai pas vu les vecteur... BRef gmp c'est bien c'est GPL mais pour les étudiant il existe miracl. C'est lib gratuite si tu l'utilise dans tes projets mais payante si tu t'en sert pour un logiciel. Elle est bien plus riche que gmp, en crypto je ne connais pas mieux.

A+

Commentaire de twxs le 21/12/2005 09:47:20

salut kirua, je rebombis sur l'utilisation des namespace, tu as d'ailleur peut etre changé d'avis depuis le temps....
mais dans ta (tes) classe(s) cencé(e) etre réutilisable, tu doit imperativement ne pas mettre de using namespace xxx

car en ajoutant ton header a son projet, qq1 va se retrouver avec le namespace activé a l'insu de son plein gres. et ca c'est pas bien car ca va casser sa classe vector personelle par exemple.

docn pour resumer xxx:: dans les .h dans tes cpp using namespace xxx;

Commentaire de Kirua le 21/12/2005 14:11:15

Yup, j'ai pris cette habitude sur ton conseille il y a un paquet de mois déjà :) Enfin, c'est tjs bon à repréciser, j'ai en effet sans doute pas fait la modif ici.

Commentaire de Kirua le 21/12/2005 18:14:50

Une chose que je n'ai pas faite dans ce code-ci: les opérateurs + - * / ^ == et != devraient être définis comme 'const', c'est assez important. Désolé de ne pas faire la modif ici.

Commentaire de twxs le 21/12/2005 20:07:20

j'avais vu, mais pas dit ;), je degagerai aussi le S en parametre de la classe

Commentaire de Kirua le 21/12/2005 20:11:42

pourquoi? ça évite de faire les calculs intermédiaires sur les vecteurs d'entiers avec des entiers, et puis ça évite aussi d'imposer un choix (par exemple: double).

et il y a une faute d'ortho trop bête dans le commentaire -_-

Commentaire de twxs le 21/12/2005 20:32:31

il est preferable de templater les methodes
template<typename S>
CVecteur2D operator* (const S factor) const
{
  return CVecteur2D( T(factor)*x, T(factor)*y );
}
template<typename S>
CVecteur3D(const CVecteur3D<S>& V) { x = (T)V.x; y = (T)V.y; z = (T)V.z; }

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Coord 2D to 3D [ par bat67000 ] Comment optenir d'un point 2D sur l'app les coordonnees du point 3D associé avec la matrice de projection ?(je pige pas bien comment fonctionne la mat de la 3d a la 2d [ par azkab ] bonjour tt le monde,dans mon projet j ai un nombre de primitives (rectangles, cercles, polygones, lignes..) que j ai modelisé en 2d. je stock leur con allegroGL ... [ par screamX ] Je me tate en se moment pour développer un apps en 2D + 3D...je sais pas trop qu'elle lib utiliser... je 'maitrise' allegro mais la 3D c'est pas son f Probleme vecteur 3D et projection orthogonale [ par supergrey ] Salut,&nbsp;voila le probleme:J'ai deux vecteurs 3D, V(xv,yv,zv) et P(xp,yp,zp), et je voudrais calculer les vecteurs v0 et v1 de sorte que: v0+v1=V ( matrice*vecteur=vecteur? [ par Arnaud16022 ] petit pb d'operator sur prografix on trouve: X' = A * X X' &#233;tant les nouvelles coordonn&#233;es du point, X les anciennes et A la matrice de t Objet COM [ par 0xYg3n3 ] Bonsoir, Voila je ne sais pas si je vais arriver a me faire comprendre. Je me demandais si un objet qui n'a pas initialiser d'interfaces COM peut qu Comment fonctionne un moteur 2D ? [ par psykocrash ] Bonjour,J'ai pour projet de d&#233;velopper un rpg &#224; la Final Fantasy (en 2D, 4 h&#233;ros, un inventaire pour les techniques et les armes, des c une file Template dans un Vecteur Template [ par grand_duck ] voici le probl&#232;me j'ai une classe de vecteur template et une classe de file template je voudrais mettre ma file template dans mon vecteur est-ce Image 2D sur fond 3D [ par CyberP ] J'ai une question peut &#234;tre stupide mais comment faire pour dessiner une image par dessus un rendu OpenGL ? Je pensais utiliser les trucs avec bi [VC++] Affichage d'une en courbe 2D et 3D [ par crocgunter ] Bonjour &#224; tous..Je dispose d'une image BMP que je transforme en tableau de points.Dans un premier temps, je veux r&#233;aliser une coupe de l'ima


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales