Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > Contribuez
Contribuez Vos contributions pour la rubrique 2D / 3D / Jeux : FAQs, codes sources, tutoriels, sondages, débats, idées, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 29/08/2006, 09h36   #1 (permalink)
Rédacteur/Modérateur
 
Avatar de bafman
 
Nom : Michel de Verdelhan
Date d'inscription: novembre 2003
Localisation: Paris
Âge: 25
Messages: 2 508
Par défaut [FAQ] [Mat/Quat]ajout calculs vectoriels

je me suis appreçu qu'on ne parle meme pas des calculs de vecteurs dans la FAQ matrice et quaternion alos que ce serais surement un des sujet qui aiderais le plus les debutant donc je me lance. (dans le desordre )

Qu'est ce qu'on vecteur ?
Un vecteur peut etre vu comme une matrice à une seule colonne. par exemple, un vecteur 3D va se representer grace à un triplet {x,y,z}. On peut utiliser les vecteurs comme des positions dans l'espace ou comme des directions. Par exemple, en 3D, un vertex sera un vecteur position alors qu'une normale sera un vecteur direction.

Comment calculer les produit scalaire entre deux vecteurs ?

le produit scalaire entre deux vecteurs est la somme des produits composantes à commposantes des vecteurs et se calcul de la façon suivante :
scalaire = v1.x*v2.x + v1.y*v2.y + v1.z*v2.z
avec v1 et v2 des vecteurs 3D (il suffit de supprimer les calculs en Z pour passer en 2D)

Que represente le produit scalaire entre deux vecteurs ?

Si les deux vecteurs sont normalisé (voir qu'est ce qu'un vecteur normalisé), le produit scalaire represente le cosinus de l'angle entre les deux vecteurs.
on peut aussi utiliser le produit scalaire pour effectuer une projection d'un vecteur sur un autre (voir comment calculer la projection d'un vecteur sur un autre).
Lorsque les vecteur represente des directions, on peut utiliser le produit scalaire pour savoir si les deux vecteurs sont dirigé dans le meme sens (vois comment savoir si deux vecteurs sont dans le meme sens).

celle la est a compléter, il existe surement plein d'autres utilisation.

qu'est ce qu'un vecteur normalisé ?
Un vecteur normalisé est un vecteur dont la norme est egale à 1 (voir qu'est ce que la norme d'un vecteur)
Les vecteur normalisé sont très utilisé en 3D, notamment pour representer des normales.

comment calculer la projection d'un vecteur sur un autre ?
le calcul de la projection d'un vecteur sur un autre se fait à l'aide du produit scalaire.
soit V1 et V2 deux vecteurs, "." represente le produit scalaire. la projection de V1 sur V2 se fait de la façon suivante :
scalaire = V1.V2
VResult = V2 * scalaire
où VResult est le vecteur résultat.

comment savoir si deux vecteur sont dans le meme sens ?
On peut savoir si deux vecteur sont dans le meme sens en regardant leur produit scalaire. Il existe cinq cas :
- le produit scalaire est inferieur à 0 : les vecteur sont de sens opposé
- les deux vecteurs sont normalisé et le produit scalaire vaut -1 : les deux vecteur sont de sens opposé et sont colineaires
- le produit scalaire vaut 0 : au moins un des vecteurs vaut 0
- le produit scalaire est superieur à 0 : les vecteur sont dans le meme sens
- les deux vecteur sont normalisé et le produit scalaire vaut 1 : les deux vecteurs sont identiques.

comment normaliser un vecteur ?
On peut normaliser un vecteur en divisant chaque composante par la norme du vecteur. Voici un code simple pour normaliser un vecteur :
Code :
 
float norme = v.getNorme();
v.x = v.x / norme;
v.y = v.y / norme;
v.z = v.z / norme;
 
(voir qu'est ce que la norme d'un vecteur)

qu'est ce que la norme d'un vecteur ?
La norme d'un vecteur est sa longeur absolue dans l'espace.

comment calculer la norme d'un vecteur ?
Le calcul de la norme d'un vecteur est reès simple, il s'agit simplement de sa distance heuclidienne qui se calcul comme ceci :
norme = sqrt(v.x*v+x + v.y*v.y + v.z*v.z)
On peut s'appercevoir ici que la norme du vecteur est en fait la racine carré du produit scalaire du vecteur avec lui meme.
Attention neanmoins à limiter le plus possible l'utilisation de ce calcul. En effet, le calcul de racine carré est relativement lent, il est donc préférable de l'éviter autant que possible dans une application temps réel.

Comment calculer le symetrique d'un vecteur par rapport à un autre ?
Le symetrique d'un vecteur par rapport à un autre se calcul comme ceci :

scalaire = V1 . V2
VTemp = V2 * (scalaire * 2)
VResult = VTemp + V1

avec V1 le vecteur pour lequel on souhaite calculé le reflet, V2 le vecteur "axe de symetrie" et "." le produit scalaire

---------------------------------------------------
Bon je m'arrete la pour l'instant, il y a probablement de chose à modifier/affiner, et des accents a ajouté (firefox oblige ) dans ce que j'ai ecrit.
dans la liste des choses à ajouter, il y a :
- produit vectoriel
- calcul de l'angle entre deux vecteur
- liens avec les matrices ?
- surement pleins d'autres
__________________
Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
Mes articles
bafman est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 29/08/2006, 16h47   #2 (permalink)
Responsable Algorithmes
 
Avatar de millie
 
Date d'inscription: juin 2006
Localisation: Luxembourg
Messages: 6 940
Par défaut

Quelques remarques.

Citation:
Un vecteur peut-être vu comme une matrice à une seule colonne.
Je pense que quelqu'un qui sait ce qu'est une matrice mais pas un vecteur ne court pas les rues. Donc ce n'est peut-être pas la meilleur introduction.




Citation:
le produit scalaire entre deux vecteurs est la somme des produits composantes à composantes des vecteurs et se calcule de la façon suivante :
scalaire = v1.x*v2.x + v1.y*v2.y + v1.z*v2.z
Peut-être introduire la notion de champ avant.



Citation:
Si les deux vecteurs sont normalisés (voir qu'est ce qu'un vecteur normalisé)
Dans ce cas, mettre l'autre définition avant.

Citation:
Un vecteur normalisé est un vecteur dont la norme est egale à 1 (voir qu'est ce que la norme d'un vecteur)
Idem, il faut définir la norme avant (par exemple avec le produit scalaire).



Citation:
comment savoir si deux vecteur sont dans le meme sens ?
Plus détailler, en 3d, la notion de sens n'est pas forcement évident.

Citation:
comment normaliser un vecteur ?
On peut normaliser un vecteur en divisant chaque composante par la norme du vecteur. Voici un code simple pour normaliser un vecteur :
Code :
 
float norme = v.getNorme();
v.x = v.x / norme;
v.y = v.y / norme;
v.z = v.z / norme;
 
(voir qu'est ce que la norme d'un vecteur)
Faux si le vecteur est nul.


Citation:
qu'est ce que la norme d'un vecteur ?
La norme d'un vecteur est sa longeur absolue dans l'espace.
Tu parles alors de la norme euclidienne, car il peut y avoir d'autres normes (par exemple, norme infinie, ou norme 1), qui sont parfois utilisées.


Voilà, sinon, il y a pas mal de fautes d'orthographe que je n'ai pas corrigé.


Edit: Calcul de l'angle entre deux vecteurs

Si l'on dispose de deux vecteurs u =(xu,yu,zu) et v = (xv, yv, zv). L'angle aentre les vecteurs u et v n'est défini que si les deux vecteurs sont non nuls. Dans ce cas, le cosinus de l'angle vaut :
a = <u,v> / (||u|| * ||v||)

Où <u,v> désigne le produit scalaire et ||.|| la norme euclidienne.
Ainsi :
a= (xu * xv + yu * yv + zu * zv) / (racine(xu²+yu²+zu²) * racine(xv²+yv²+zv²))

Où racine désigne la racine carré.
__________________
Je ne répondrai à aucune question technique en privé

Dernière modification par millie ; 01/01/2007 à 20h41.
millie est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 31/12/2006, 19h25   #3 (permalink)
Membre émérite
 
Avatar de rostomus
 
Date d'inscription: décembre 2006
Localisation: Alger --> Paris
Âge: 26
Messages: 759
Par défaut

Bonjour,

Citation:
Envoyé par bafman
soit V1 et V2 deux vecteurs, "." represente le produit scalaire. la projection de V1 sur V2 se fait de la façon suivante :
scalaire = V1.V2
VResult = V2 * scalaire
où VResult est le vecteur résultat.
Je pense que c'est faux, le vecteur de projection se calcule comme suit:
scalaire = V1.V2
VResult = V2*scalaire/||V2||^2

Citation:
Envoyé par bafman
- le produit scalaire vaut 0 : au moins un des vecteurs vaut 0.
vous avez oublié le cas V1 est orthogonal à V2 (plus important)

Citation:
Envoyé par bafman
Le symetrique d'un vecteur par rapport à un autre se calcul comme ceci :

scalaire = V1 . V2
VTemp = V2 * (scalaire * 2)
VResult = VTemp + V1

avec V1 le vecteur pour lequel on souhaite calculé le reflet, V2 le vecteur "axe de symetrie" et "." le produit scalaire
.
Je ne trouve pas que ca nous donne une symétrie par rapport à V2.
Contre exemple:
soient: V1=(1,0) et V2=(0,1): le vecteur symétrique de V1 par rapport à V2 est evident: V3=(-1,0), or:
scalaire=0
VTemp=V2*(scalaire*2)=0
Vresult=VTemp+V1=V1 et il faut trouver -V1 pour ce cas
Je pense que deux vecteurs sont symétrique par rapport à V si :
-les 3 vecteurs V V1 et V3 appartiennent au même plan
-ils ont la même projection sur V

Citation:
Envoyé par millie
Si l'on dispose de deux vecteurs u =(xu,yu,zu) et v = (xv, yv, zv). L'angle aentre les vecteurs u et v n'est défini que si les deux vecteurs sont non nuls. Dans ce cas, cet angle vaut :
a = <u,v> / (||u|| * ||v||)
.
le a ici n'est pas l'angle entre u et v, mais c'est le cosinus de l'angle
a=cos( angle)

Dernière modification par rostomus ; 31/12/2006 à 22h52.
rostomus est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 31/12/2006, 23h03   #4 (permalink)
Membre émérite
 
Avatar de rostomus
 
Date d'inscription: décembre 2006
Localisation: Alger --> Paris
Âge: 26
Messages: 759
Par défaut

Bonjour,

Pour trouver le vecteur symétrique v2 de vecteur v1 par rapport au vecteur v
on a:
v1+v2=(2*<v1.v>/|v|^2)*v ==> v2=(2*<v1.v>/|v|^2)*v-v1
rostomus est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 01/01/2007, 20h42   #5 (permalink)
Responsable Algorithmes
 
Avatar de millie
 
Date d'inscription: juin 2006
Localisation: Luxembourg
Messages: 6 940
Par défaut

Citation:
Envoyé par rostomus
le a ici n'est pas l'angle entre u et v, mais c'est le cosinus de l'angle
a=cos( angle)

Oui oui, rectifié Merci
__________________
Je ne répondrai à aucune question technique en privé
millie est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/06/2007, 17h11   #6 (permalink)
Membre Confirmé
 
Date d'inscription: octobre 2005
Messages: 268
Par défaut

Que représente le produit vectoriel entre deux vecteur
Le produit vectoriel de deux vecteurs u et v est l'unique vecteur w qui vérifie:
_ w est orthogonal à u et v.
_ (u, v, w) est de sens direct.
Si u = (ux, uy, uz) et v = (vx, vy, vz), alors w = (uy*vz-uz*vy, uz*vx-ux*vz,ux*vy-uy*vx).
Si on connait l'angle a entre les deux vecteurs, on a ||w|| = ||u||*||v||*sin(a). Celà implique notamment que deux vecteurs colinéaires ont un produit vectoriel nul.

Utilité du produit vectoriel
Calcul des normales à un plan:
Soit u et v deux vecteurs d'un plan. Alors le produit vectoriels de u et de v est une des normales du plan.



Redesign de ce qu'à dit Millie sur le calcul de l'angle entre deux vecteurs:

Calcul de l'angle entre deux vecteurs
Si l'on dispose de deux vecteurs u =(xu,yu,zu) et v = (xv, yv, zv). L'angle entre les vecteurs u et v n'est défini que si les deux vecteurs sont non nuls. Dans ce cas :
cos a = <u,v> / (||u|| * ||v||)
sin a = ||u^v|| / (||u|| * ||v||)

Où <u,v> désigne le produit scalaire, u^v le produit vectoriel et ||.|| la norme euclidienne.
Ainsi :
cos a = (xu * xv + yu * yv + zu * zv) / (racine(xu²+yu²+zu²) * racine(xv²+yv²+zv²))
sin a = ... (je ne tape pas la formule, elle est longue et je pense qu'il serait bien d'en faire une image pour plus de lisibilité)

Ces méthodes permettent d'obtenir le sinus et le cosinus d'un angle pour un coût très faible.


Citation:
qu'est ce qu'un vecteur normalisé ?
Ajouter: les vecteurs normalisés servent notamment lors des calculs vectoriels dans lesquels les vecteurs représentent une direction. Ainsi le calcul s'en trouve simplifié, car leur norme vaut 1 (exemple sur le calcul de l'angle entre deux vecteurs).
Albenejean est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/10/2009, 15h05   #7 (permalink)
Invité de passage
 
Date d'inscription: janvier 2008
Messages: 3
Par défaut

Citation:
Envoyé par rostomus Voir le message
v1+v2=(2*<v1.v>/|v|^2)*v ==> v2=(2*<v1.v>/|v|^2)*v-v1
Bonjour,

merci rostomus pour ta réponse, c'est ce que je cherchais depuis quelques jours.
J'avais trouvé une formule similaire à celle de bafman sur d'autres forum, mais celle ci ne fonctionne pas.

Je suis en train de faire un moteur physique et j'avais besoin de cela pour calculer les rebonds.
D'ailleurs, on peut se passer de la norme |v| puisque c'est le résultat d'une racine carré et on met la norme au carré donc ça s'annule.
La racine carré est très gourmande en temps processeur, donc si on peut s'en passer...
Voila mon bout de code qui marche très bien :

//le produit scalaire de V1 et V2 :
double scalaire = dot(V1,V2);

// la norme de V2 au carré :
double norme2=V2.x*V2.x + V2.y*V2.y + V2.z*V2.z;

double Temp = (scalaire*2)/norme2;

// le résultat :
VECTOR3D reflected = (Temp*V2)-V1;

Où reflected est le vecteur symétrique de v1 par rapport au vecteur v2
dvince38 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS 2D - 3D - JEUXLES FAQsTUTORIELSOUTILSBIBLIOTHEQUESMEDIASLIVRESSOURCESTVBLOG

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > Contribuez



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 23h32.


Vos questions techniques : forum d'entraide 2D - 3D - Jeux - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.