calcul du normal d'un triangle en c++ - C++ - Programmation
Marsh Posté le 22-01-2007 à 22:13:00
ReplyMarsh Posté le 22-01-2007 à 22:31:49
Oui, j'avoue, j'ai essayé plusieurs fois d'y comprendre quelque chose moi aussi, et finalement ... joker
Marsh Posté le 23-01-2007 à 09:25:28
ok je corrige on fait je voudrai faire le calcul du normal moyen de 2 vecteurs qui est là Ne Ne=N1+N2/||N1+N2|| et de calculer aussi He le normal moyen du triangle He= 2|e|cosOe/2. tandis que cosOe=<produit scalaire de N1,et Ne>. comment pourai-je faire ce calcul en c++. voilà j'edpére que j'ai été clair cette fois.
Marsh Posté le 23-01-2007 à 09:42:56
Ta question, c'est "comment calculer une norme et un produit scalaire ?" ?
Marsh Posté le 23-01-2007 à 09:48:48
voilà c'est ça ma question............le produit scalaire de 2 norme est égal au cosinus de l'angle entre ces 2 angles non????
Marsh Posté le 23-01-2007 à 10:38:12
Le produit scalaire usuel de deux vecteurs de norme 1 est egal au cosinus de l'angle entre les deux vecteurs, oui.
La norme euclidienne pour un vecteur.
(x)
(y) = sqrt( x*x + y*y + z*z )
(z)
Avec sqrt la racine carree.
Le produit scalaire de ces deux vecteurs :
(x1) (x2)
(y1).(y2) = x1*x2 + y1*y2 + z1*z2.
(z1) (z2)
Mais bon, ca c'est des maths et permets moi de te demander quel est ton niveau d'etudes si tu ne savais pas ca ...
Marsh Posté le 23-01-2007 à 10:47:34
on fait on math je le sais je suis en bacc+5 biomédical et je fais la programation mais c'est la programation en c++ que je connais pas comment les faire c'est juste ça mon problème on fait . mais sin non pour le calcul de math je le connais. d'accord comme maintenant on pourra faire le calcul du produit scalire entre 2 vecteur mais ce que t'as oublié de le dire que le cos de l'angle entre les 2 vecteurs se fait on fait entre le vecteur moyen et 1 de 2 vecteurs, mais bon. Juste un petit truc comment pourai-je calculer le vecteur moyen qui est égale à: N1+N2/||N1+N2|| .......en c++!!!!!!!!!! ok merci en avance
Marsh Posté le 23-01-2007 à 12:28:38
on commence par creer une structure de donnees "vecteur" qui encapsule
les coordonées du dit vecteur et ensuite, il reste à ecrire les fonctions qui vont bien ^^
Sinon : Blitz++, NT2, uBlas ...
Marsh Posté le 23-01-2007 à 13:23:47
hamoudasafira1 a écrit : Juste un petit truc comment pourai-je calculer le vecteur moyen qui est égale à: N1+N2/||N1+N2|| .......en c++!!!!!!!!!! |
Mais p**** tu veux quoi? Qu'on te le code a ta place ?
Marsh Posté le 23-01-2007 à 13:28:16
une classe vecteur, avec opérateur addition, division scalaire, méthode de norme et voilà ^^
Marsh Posté le 23-01-2007 à 13:46:01
pour Mr.Ace17 non merci je n'aurai pas besoin
#include <iostream.h>
class vecteur
{
private : //la structure interne d'un vrai objet n'a pas à être publique
float x,y,z;
protected : //à la rigueur les heritiers peuvent accéder
//directement aux attributs
void setx(float a=0) {x=a;}
void sety(float a=0) {y=a;}
void setz(float a=0) {z=a;}
public :
vecteur(float a=0,float b=0,float c=0) {x=a;y=b;z=c;} //constructeur
//les accesseurs en lecture sont publics
float getx(void) {return(x);}
float gety(void) {return(y);}
float getz(void) {return(z);}
void affiche(ostream &flux) //flux est en argument car je veux pouvoir utiliser cout mais aussi tout fichier texte
{flux<<"["<<x<<","<<y<<","<<z<<"]";}
void saisie(istream &flux); //si le flux est cin on pose des questions sur cout, sinon on saisit sans question
void additionner(float a)
{x=a+x;y=a+y;z=a+z;}
void additionner(float a,float b,float c) //ceci est une surcharge.
{x=a+x;y=b+y;z=c+z;}
void additionner(vecteur a) //encore une surcharge.
{x=x+a.x;y=y+a.y;z=z+a.z;}
float norme(void) {return(sqrt(x*x+y*y+z*z));} //calcule la norme
void normer(void) {float n=norme();x/=n;y/=n;z/=n;} //le modifie (le rend unitaire)
void multiplier_par(float a) {x=a*x;y=a*y;z=a*z;}
float prodscal(vecteur v) {return(x*v.x+y*v.y+z*v.z);}
vecteur operator = (int arg) //opérateur de copie, prévu ici uniquement pour écrire V=0
{ if(arg==0) x=y=z=0; else cout<<"affectation suspecte\n"; }
}; //n'oubliez pas ce ; c'est la fin d'une déclaration
void vecteur::saisie(istream &f)
{
if(f==cin)cout<<"entrez x : ";
f>>x;
if(f==cin)cout<<"entrez y : ";
f>>y;
if(f==cin)cout<<"entrez z : ";
f>>z;
}
//redéfinition des opérateurs (sous forme de fonctions)
ostream& operator << (ostream &f,vecteur v)
{v.affiche(f);return(f);}
istream& operator >> (istream &f,vecteur &v)
{
v.saisie(f);
return(f);
}
vecteur operator ^ (vecteur v,vecteur w) //produit vectoriel
{vecteur z(
v.gety()*w.getz()-w.gety()*v.getz() ,
v.getz()*w.getx()-w.getz()*v.getx() ,
v.getx()*w.gety()-w.getx()*v.gety()
);
return(z);
}
vecteur operator * (float f,vecteur v) //produit par un réel
{vecteur z=v;
z.multiplier_par(f);
return(z);
}
vecteur operator * (vecteur v,float f) //le prod par un float est commutatif !!!
{return(f*v);} //je l'ai déjà défini dans l'autre sens, autant s'en servir !
vecteur operator / (vecteur v,float f)
{return(v*(1/f));}
float operator * (vecteur v,vecteur w) //produit scalaire
{return v.prodscal(w);}
vecteur operator + (vecteur v,vecteur w) //somme vectorielle
{vecteur z=v;
v.additionner(w);
return(z);
}
vecteur operator - (vecteur v,vecteur w) //différence vectorielle
{return(v+((-1)*w));}
/* petit programme main si l'on veut tester l'objet ***********
int main(void)
{
vecteur v(1,1,0),w,z;
cout<<"la norme de "<<v<<" vaut "<<v.norme()<<"\n";
cout<<"entrez vos nouvelles coordonnées :\n";
cin>>w;
cout<<"la norme de "<<w<<" vaut "<<w.norme()<<"\n";
cout<<"le prod scal de "<<v<<" et "<<w<<" est "<<v.prodscal(w)
<<" (ou "<<v*w<<" )\n";
z=2*(v^w);
cout<<"le double de leur prod vect vaut "<<z<<"\n";
}
voilà le code mais ce je voudrai le faire c'est en utilisant le vtkSyrface par exemple au lieu de faire tout cela pour faire le produit scalaire je pourrai faire vtkMath::Dot(vecteur V1, vecteur V2)
mais comment utiliser ces trucs pour faire tout le cacul vous avez une idée????
Marsh Posté le 23-01-2007 à 14:44:06
si mes étudiants me rendait un tp comme ça, je pense qu'il n'aurait pas la moyenne ...
-> tu en respecte pas la forme canonique de coplien
-> en quelle honneur les mutateurs sont protégés ?
-> les passage d'objet en paramétres se font par REFERENCE CONSTANTE et non par valeur.
-> iostream.h est déprécié, utilise iostream
-> return est un mot clé, pas une fonction
->
2/20 on reprends svp
Marsh Posté le 23-01-2007 à 15:33:16
ou merci ça on fait été un cours mais mois je ne lprend pas tous j'ai prend uniquement ce que j'aurai besoin qoui c'est tout mais ce n'est pas mon programme
Marsh Posté le 23-01-2007 à 16:01:00
tu peux sûrement tout faire en vtk oui, c'est une lib de visualisation donc les vecteurs et leurs opérations sont couverts.
Marsh Posté le 23-01-2007 à 16:28:03
mais le problème que je sais trop comment faire par exemple je veux mettre mon bou de code:
class vtkAnisotropicFilter
{
public :
//déclaration + allocation d'un tableau de 2 dimensaions et de i chaines
void SetInput(vtkSurface *Input) {this->Input=Input;};
//calcul du vecteur H(e)=He*Ne (vecteur du courbure moyenne) tel que Ne=N1+N2/||N1+N2|| He=2|e|cosOe/2
void AnisotropicSmoothing( double M,double Lambda,double s,int n)//M(maillage), Lambda(caract. de détection du paramétre),s(facteur de l'échelle)
{
for(int i;i<n;i++)//n nombre d'étape
{
double DeltaLambda=0;
for (int e=0; e<this->Input->GetEdgeVertices(); e++)
{
double N1,N2;
this->Input->GetEdgeVertices(e,i,j)//pour obtenir la barêtte esj
vtkMath::Norm(N1[i]);//calcul du norme ||N1+N2||
vtkMath::Norm(N2[i]);
vtkMath::Dot(N1[i],Ne[i]);//produit scalaire
1)comment additionner 2 vecteur en vtkSurface?????
2)si je faire le calcul entre les 2 sommets i et j il faut tout d'abord je les déclarts comme ils sont dans getedgevertices (en dessus) comment les fair edéclarer???
Marsh Posté le 23-01-2007 à 16:50:47
hamoudasafira1 a écrit : ou merci ça on fait été un cours mais mois je ne lprend pas tous j'ai prend uniquement ce que j'aurai besoin qoui c'est tout mais ce n'est pas mon programme |
et le cours d'expression écrite ?
Marsh Posté le 23-01-2007 à 17:00:08
je comprends plus rien là... pourquoi tu pars dans du smoothing anisotropic alors que tu voulairs faire un simple calcul vectoriel au début ? c'est quoi la question ? pour additionner 2 vecteurs VTK, il doit y avoir des fonctions qui vont bien sur ces objets dans la lib non ? c'est un gag ?
Marsh Posté le 23-01-2007 à 17:52:40
oui c'est un gag
ou début j'ai parti d'un calcul vectoriel oui c'est vrai, je l'aurai besoin dans ma classe, et puis je dois le faire en utilisant la biblio de vtksurface j'ai arrivé à faire quelque chose comme le calcul du norme et le produit scalaire mais j'arrive pas à les faire réueni pour calculer le vecteur moyen Ne et l'autre vecteur He . tandis que He=2|eij|cosOe/2
telque eij est la distance entre les 2 sommets i et j et on pourra faire le calcul comme ça:
this->Input->GetDistanceBetweenVertices(i,j);
et cosOe/2=produit scalaire entre le vecteur N1 et Ne (vecteur moyen) et il se fait comme ça :
vtkMath::Dot(N1[i],Ne[i]);
donc comment pourrai-je multiplier le valeur de eij=this->Input->GetDistanceBetweenVertices(i,j);
avec cosOe/2=vtkMath::Dot(N1[i],Ne[i]);
pour calculer Ne: Ne=N1+N2(addition vectorielle)/||N1+N2||(la norme)
voilà c'est ça mon problème
Marsh Posté le 23-01-2007 à 18:56:54
Allez je t'aide :
Code :
|
Voila, reste a implémenter la classe Vector (ce qui n'est pas difficile)
Marsh Posté le 23-01-2007 à 19:21:23
je te remercie mias ce n'est pas comme ça qu'il faut faire, mais il faut utiliser la biblio de vtkSurface en tout cas je te remercie infiniment et désoler si je vous ai déranger tous et merci bien à vous pour votre effort pour m'aider. voilà ce que j'essaies de le faire mis jusqu'à maintenant je ne sais pas si ça va marcher ou pas?
Code :
|
Marsh Posté le 23-01-2007 à 21:13:47
Ace17 a écrit : Allez je t'aide :
|
Presque
Code :
|
juste pour le detail
Marsh Posté le 23-01-2007 à 23:04:22
les operateurs surchargés symmetriques n'ont pas à etre des méthodes d'instances car l'objet *this ne joue pas de rôle particulier.
Avec le bon lot d'accesseur, Norme n'a pas besoin d'etre friend ni de connaitre le contenu privé de vector.
Marsh Posté le 23-01-2007 à 23:07:53
Est-ce que, dans ce cas, tu inline explicitement les accesseurs, ou est-ce que tu laisses le compilo faire son boulot d'optimisation?
Jusqu'à récemment, j'explicitais toujours, mais maintenant que j'ai lu un peu plus de docs sur mon compilo (VC++ express à ce jour), j'hésite
Marsh Posté le 23-01-2007 à 23:09:55
ca depend fortement du compilateur. En general, pour des classes non tempalte, j'explicite. Sinon je laisse l compilo faire.
De toute manière, l'inilining est une otpimisation, donc à faire en dernier
Marsh Posté le 24-01-2007 à 15:35:15
merci les gars pour vos aides je l'apprecie vraiment j'ai trouver qlq au labo qui m'a passer un coup de main et voilà la résultat si qlq d'entre vous pourra s'enservir peut être!!!
Code :
|
Marsh Posté le 24-01-2007 à 16:54:30
Monsieur le Professeur (de quoi ?) Joel T j'ai compté 13 fautes de syntaxe ou d'orthographe dans votre première intervention, alors avant de vouloir imposer telle ou telle norme de presentation et d'analyse, commencez par écrire correctement le Français ; l'absence de rigueur linguistique - par exemple l'usage abusif de l'anglais - est sympthomatique d'une aculturation.
Marsh Posté le 24-01-2007 à 17:25:56
stabia a écrit : Monsieur le Professeur (de quoi ?) Joel T j'ai compté 13 fautes de syntaxe ou d'orthographe dans votre première intervention, alors avant de vouloir imposer telle ou telle norme de presentation et d'analyse, commencez par écrire correctement le Français ; l'absence de rigueur linguistique - par exemple l'usage abusif de l'anglais - est sympthomatique d'une aculturation. |
on se connait
Ensuite, bon, l'usage "abusif" de l'anglais, hein, ca s'appelle des termes techniques
En suite F != T
Marsh Posté le 24-01-2007 à 17:51:59
Je suppose que nous ne nous connaissons pas, quand à l'usage - abusif- de l'anglais cela n'a rien à voir avec la technique mais avec l'esprit de soumission, désolé d'être si cru.
Marsh Posté le 24-01-2007 à 18:42:17
stabia a écrit : Monsieur le Professeur (de quoi ?) Joel T j'ai compté 13 fautes de syntaxe ou d'orthographe dans votre première intervention, alors avant de vouloir imposer telle ou telle norme de presentation et d'analyse, commencez par écrire correctement le Français ; l'absence de rigueur linguistique - par exemple l'usage abusif de l'anglais - est sympthomatique d'une aculturation. |
Essayez avec cette orthographe : acculturation
Marsh Posté le 24-01-2007 à 19:14:25
Bon finito les blagues. le posteur initial à sa solution, je suis une quiche en orthographe, voial fin du film
Marsh Posté le 24-01-2007 à 20:21:57
stabia a écrit : Monsieur le Professeur (de quoi ?) Joel T j'ai compté 13 fautes de syntaxe ou d'orthographe dans votre première intervention, alors avant de vouloir imposer telle ou telle norme de presentation et d'analyse, commencez par écrire correctement le Français ; l'absence de rigueur linguistique - par exemple l'usage abusif de l'anglais - est sympthomatique d'une aculturation. |
moi j'en compte 3 dans ce post, auxquelles s'ajoute un sens certain de la lecture en biais
Marsh Posté le 25-01-2007 à 09:38:58
Exact la pire étant sans aucun doute le magnifique sympthomatique (quelle horreur). De surcroît, l'usage abusif (ou non) de l'anglais, inhérent à la pratique de l'informatique (de la culture informatique) ne saurait être une acculturation sinon une assimilation.
Marsh Posté le 25-01-2007 à 09:54:10
Je pense que sur le fond, Stabia a raison. Mais la ou Stabia se trompe, c'est sur ce qui est abusif ou non. J'ai beau relire les posts de Joel F, il n'y a rien que "d'abusif", ou alors, il faut commencer a traduire les mots clef des langages de programmation, comme "return" "friend" "template", et trouver des equivalents francais pour "inlining", et "pointeur this" ... et les faire accepter par tout le monde ... Stabia, ta reflexion ressemble a celle de quelqu'un qui n'aurait jamais fait de programmation ...
Et je remercie Joel F d'avoir fait la remarque sur l'expression de hamoudasafira1 (qu'il faut excuser car le francais n'est manifestement pas sa langue maternelle) dont les messages demandent a etre lus 3 fois avant de les comprendre ...
Marsh Posté le 25-01-2007 à 21:54:31
stabia a écrit : Monsieur le Professeur Joel T j'ai compté 13 fautes de syntaxe ou d'orthographe dans votre première intervention... |
Pfff... moi je n'en compte que 9 mais je n'ai jamais été très fort au jeu des 13 erreurs. Si qqun peut faire mieux...
Marsh Posté le 28-01-2007 à 18:29:53
Je vois avec plaisir, quau moins le débat sur « linévitable anglais » pourrait renaître, dailleurs plusieurs jugements viennent dêtres rendus en ce sens.
Le « c » suivant un « a » privatif sil est généralement redoublé ne lest pas toujours, par exemple « acalculie », « acinétique », « acaule », « acarpe », « aclinique » ou encore « acompte », il est vrai que le mot « acculture » sécrit généralement et normativement ! avec les deux « c » de façon à induire une prononciation faisant ressortir le « a » ; cependant cest un néologisme sartrien et je commets souvent cette faute dun seul « c » parce Sartre y voyait un phénomène de substitution alors que je pense, en ce qui concerne les informaticiens (et de nombre de jeunes gens ayant étudié des disciplines techno-scientifiques), quil sagit bien dune perte de culture, avec comme corollaire une perte de « densité » humaine. La plupart des professeurs de ces disciplines sont aujourdhui conscients de ce problème et certains sont même atterrés des insuffisances quils découvrent chez leurs élèves (cf. lappel de lIUT de Grenoble).
Et oui, jai oublié un accent et ajouté un « h » à un mot dorigine grecque , cest lamentable, néanmoins je vous prie de me le pardonner.
Je vis de la programmation depuis 1984, jai programmé en une douzaine de langages sous une petite dizaine de systèmes dexploitation, est-ce le cas de beaucoup dentre vous ?
Ma réaction initiale provenait du caractère un peu agressif du message en cause ; un professeur se doit, à défaut dêtre parfait, au moins de montrer lexemple de la rigueur.
Marsh Posté le 28-01-2007 à 19:01:36
stabia a écrit : Je vois avec plaisir, quau moins le débat sur « linévitable anglais » pourrait renaître, dailleurs plusieurs jugements viennent dêtres rendus en ce sens. |
On utilise des mots anglais pour désigner des choses et des concepts qui n'existaient pas avant contact avec ceux-ci. Ou est la culture que l'on perds en ne nommant pas ceux-ci en français alors que les termes français sont créés à posteriori ?
Par contre sur le fait que les étudiants en info sont pour une bonne partie très mauvais en français, j'irais pas dire le contraire, y'a cependant un peu de prise de conscience du problème, j'ai eu cette année en L3 des "cours d'expression" pour qu'on revoie les bases, les profs en ont assez de s'arracher les yeux sur les thèses, contrôles, etc...
Mais c'est pas le même problème, à part quelque cas isolés (dimentions/dimensions par exemple), les anglicismes n'influent pas vraiment sur les capacités en français. Je doute que le fait de dire "pointeur this" soit corrélé avec l'incapacité d'accorder ou de conjuguer.
Marsh Posté le 22-01-2007 à 18:35:44
j'ai un problème pour faire le calcul du normal du barêtte eij tel que i et mes sommets des triangles et j les voisins des ces sommets dans les mêmes triangles, tandis que Ne=N1+N2/||N1+N2|| et le normal moyenne du triangle He=2|e|cosOe/2. Oe est le produit scalaire du <N1,Ne>. voilà comment pourai-je faire ce calcul. merci en avance pour vos aides.