CLASS VECTEUR 3D

barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007 - 2 mars 2005 à 21:58
brubru777 Messages postés 2 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 12 mai 2006 - 7 nov. 2005 à 02:18
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29879-class-vecteur-3d

brubru777 Messages postés 2 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 12 mai 2006
7 nov. 2005 à 02:18
Bonjour,

Pour un programme que j'ai fait récemment, j'ai eu besoin d'une classe vecteur. Mon code marchait plutôt bien à un petit détail près. J'ai eu un petit problème avec la surcharge des opérateurs +, -, etc. et << que j'ai redéfini pour afficher les vecteurs en texte sous la forme "(x, y, z)".

Dans un premier temps, j'ai défini les opérateurs arithmétiques de la manière suivante :

vecteur operator+(const vecteur &v) {
vecteur tmp;
tmp.x = x + v.x;
tmp.y = y + v.y;
tmp.z = z + v.z;
return tmp;
}

Cela marchait très bien pour les calculs mais pas pour l'affichage. C'est-à-dire que pour afficher la somme de deux vecteurs, je devais faire :

v = v1 + v2;
cout<<v;

Dans le cas où je mettais juste "cout<<(v1 + v2);", j'avais un message d'erreur.

Pour résoudre ce problème, j'ai redéfini les opérateurs comme cela :

vecteur &operator+(const vecteur &v) {
vecteur &tmp;
tmp->x = x + v.x;
tmp->y = y + v.y;
tmp->z = z + v.z;
return *tmp;
}

Cette solution semble fonctionner aussi bien pour le calcul que pour l' affichage. Cependant, je me demande si elle est bien correcte. Car si j'ai bien compris, on transmet juste l'adresse de la variable tmp et celle-ci est détruite juste après l'opération. Si c'est le cas, ça marcherait donc juste par hasard parce qu'aucun autre processus ne serait venu altérer la mémoire à cet endroit-là.

Est-ce que quelqu'un pourrait m'expliquer ce qui ne marche pas avec la première méthode et pourquoi la deuxième méthode qui me semble incorrecte marche?

D'avance merci.
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
5 mars 2005 à 11:19
En effet, moi c'était envoyé au gestionnaire d'exception, mais dans ce cas, tu as raison, on ne peut rien définir.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
4 mars 2005 à 22:57
c'était num == 0, pas nul == 0, désolé.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
4 mars 2005 à 22:57
À propos du cas de la division par 0 ... je pense que ds énormément de cas le programmeur prend déjà par ailleurs la précaution ailleurs dans son code, et que donc faire ce test est redondant. De plus, dans ta classe tu ne sais pas, a priori, comment gérer l'erreur: déclencher une exception, retourner un vecteur 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF ? (et si tu templatise c'est pas possible), retourner le vecteur nul, allumer un flag erreur static de la classe ... c'est pas pratique. En plus, une division par zéro c'est pas dur à détecter (suffit de mettre ça dans le code:)

#ifdef DEBUG
if(nul == 0)
cout << "Division de vecteur par 0!" << endl;
#endif

L'effet, ce sera d'avertir le programmeur pdt le débuggage, et puis ben pr le reste il n'aura qu'à faire le test lui même, ça me paraît plus logique.
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 mars 2005 à 20:55
Un conseil, au lieu de ca:
float operator * (Vector3D Vector)
{
return (x * Vector.x + y * Vector.y + z * Vector.z);
}

met ca:
float operator * (const Vector3D & Vector)
{
return (x * Vector.x + y * Vector.y + z * Vector.z);
}

C'est beaucoup plus rapide, car tous ceux qui programment sur openGL ont besoin de performance.

De plus, j'ai fais ma propre classe vecteur 3D, en template, ce qui me permet de modifier le type de données de mes vecteurs, genre int, float, double, etc ..., ou autre. Ca peut présenter un intérêt.

De plus, si je vais vecteur / 0 ? il se passe quoi ? il faut donc gérer tous les cas possible pour rendre une classe de vecteur utilisable par tout le monde. Et dernière chose, je pense qu'il vaut mieux séparer en .h et .cpp ou .inl si tu déclares les fonctions en inline.

Dernières chose, si V est un vecteur,
X 4*V, ta classe le gère ? ou alors il faut mettre X V*4

Aller ++ :)
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
3 mars 2005 à 18:36
Super merci bien pour tous ces commentaires !
je corrige sa sur mon code alors.
et je regarde http://www.cppfrance.com/code.aspx?ID=29029
cool ;)
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
3 mars 2005 à 17:34
Oui, on voit que techniquement si on des raisons de définir l'affectation alors pour les memes raisons il faudra détourner l'auto affectation, je pense que c'est ca.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
3 mars 2005 à 17:24
D'accord, d'accord, c'est en effet un cas à traîter quand tu as de la mémoire dynamiquement allouée, mais là pour 3 variables statiques... en même temps, t'as qd même raison sur le fond: c'est même pas la peine de les déclarer.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
3 mars 2005 à 17:03
Si il est necessaire de définir soi meme l'operateur d'assignation, alors il est certain que l'auto-assignation peut avoir des effet inattendu si elle n'est pas controlée.

Par exemple:

classe string
{
char *p;

public:

string & operator = (const string & s )
{
delete []p; // si auto asignation on libere le buffer avant
// de copier sont contenu
// new[] + copie
}

};
}
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
3 mars 2005 à 16:50
steve, je comprends pas, j'ai le droit d'assigner un objet à lui-même, pq tu veux faire un test?

Vector3D a(...);

a = a; //c'est légal; idiot mais légal

Ce serait intéressant de "templatiser" tout ça pour qu'on puisse choisir de travailler avec des int / float / double / classe perso / ...
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
3 mars 2005 à 14:46
Dans ce cas la ce n'est pas nécessaire de redefinir le constructeur de copie et operator=, il faut laisser le compilateur s'en charger.

Pour l'affectation, il ne faut pas oublier le test if( this == &Vector )
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
3 mars 2005 à 13:54
pour ce qui est de l'opérateur = je ne comprend pas trop mais prend plutot exemple sur celui-ci :

Vector3D& operator=(const Vector3D& Vector)
{
x = Vector.x;
y = Vector.y;
z = Vector.z;
return *this;
}

de même un contructeur de copie qui est très utile pour ce genre de classe :

Vector3D(const Vector3D& Vector)
{
*this = Vector;
}

tout simplement, l'opérateur = fera le reste

tu peux regarder mes sources
http://www.cppfrance.com/code.aspx?ID=29029
tu y trouvera peut-etre un peu d'inspiration ;-)

bon début en tout cas
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
3 mars 2005 à 10:28
Merci :)

et aussi un petit truc, dans la redéfinition de l'operateur = par exemple, j'ai utilisé Vector3D(x,y,z) a la place the "this" car en fait quand j'utilise "this" sa marche pas :s
si quelqu'un sai pourquoi ....
brosse_adan Messages postés 30 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 7 octobre 2005
2 mars 2005 à 22:51
on dit Dot Product pour produit scalaire, et Cross Product pour le vectoriel!

:)
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
2 mars 2005 à 21:58
Comment on dis :

produit scalaire et produit vectoriel en anglais :D

( et on se fou pas de ma gueule :D )
Rejoignez-nous