Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Technologies / Divers > 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, ...

Réponse
 
Outils de la discussion
Vieux 29/08/2006, 09h36   #1 (permalink)
Rédacteur/Modérateur
 
Avatar de bafman
 
Date d'inscription: novembre 2003
Localisation: Paris
Âge: 24
Messages: 2 317
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
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
Âge: 23
Messages: 5 536
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)
Modérateur
 
Avatar de rostomus
 
Date d'inscription: décembre 2006
Localisation: Alger
Âge: 25
Messages: 757
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)
Modérateur
 
Avatar de rostomus
 
Date d'inscription: décembre 2006
Localisation: Alger
Âge: 25
Messages: 757
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
Âge: 23
Messages: 5 536
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: 266
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
NEWS 2D - 3D - JEUXLES FAQsTUTORIELSOUTILSBIBLIOTHEQUESMEDIASLIVRESSOURCESTVBLOG

Réponse

Précédent   Forum des développeurs > Technologies / Divers > 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
Navigation rapide