IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[FAQ] [Mat/Quat]ajout calculs vectoriels


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    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
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Quelques remarques.

    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.




    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.



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

    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).



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

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    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.


    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é

  3. #3
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    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)
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  4. #4
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    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
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    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é

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    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.


    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).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    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

Discussions similaires

  1. Introduction au calcul vectoriel (Tricks)
    Par Clercq dans le forum Mathématiques
    Réponses: 0
    Dernier message: 03/12/2009, 10h10
  2. Calcul vectoriel (savoir si un point est à l'intérieur d'un triangle)
    Par Invité dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/10/2008, 22h46
  3. [FAQ] [Mat & Quat] Corrections
    Par Laurent Gomila dans le forum Contribuez
    Réponses: 26
    Dernier message: 11/06/2006, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo