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

cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008 - 27 nov. 2003 à 17:43
twxs Messages postés 3 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 21 décembre 2005 - 21 déc. 2005 à 20:32
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/18263-classe-de-vecteurs-en-2d-3d-portable-utilisation-pour-simulations-physiques

twxs Messages postés 3 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 21 décembre 2005
21 déc. 2005 à 20:32
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; }
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
21 déc. 2005 à 20:11
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 -_-
twxs Messages postés 3 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 21 décembre 2005
21 déc. 2005 à 20:07
j'avais vu, mais pas dit ;), je degagerai aussi le S en parametre de la classe
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
21 déc. 2005 à 18:14
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.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
21 déc. 2005 à 14:11
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.
twxs Messages postés 3 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 21 décembre 2005
21 déc. 2005 à 09:47
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;
thecanapit Messages postés 4 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 23:57
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+
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
26 févr. 2004 à 14: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 ?
thecanapit Messages postés 4 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 04:39
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<0) if (x>=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<<(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!
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
26 févr. 2004 à 01:47
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 :-)
thecanapit Messages postés 4 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 01:44
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
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
26 févr. 2004 à 01:41
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 :-)
thecanapit Messages postés 4 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 01:31
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!
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
23 févr. 2004 à 14:20
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.
soumpro Messages postés 52 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 7 mai 2004
23 févr. 2004 à 10:43
Non , Nico , je suis desolé !
Ca ne marche pas !
J'ai pourtant tout essayé !
Je t'assure !
GCC !
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
30 nov. 2003 à 14:30
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.
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
30 nov. 2003 à 09:31
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 !
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
28 nov. 2003 à 18:22
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
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
28 nov. 2003 à 08:00
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.
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
28 nov. 2003 à 00:10
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 ;)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
27 nov. 2003 à 17:43
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.
Rejoignez-nous