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

Algorithmes et structures de données Discussion :

Vecteur perpendiculaire via règle main droite


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut Vecteur perpendiculaire via règle main droite
    Bonjour,

    Voici les données qui me sont disponibles :
    - On travaille dans l'espace
    - Point A (x0, y0, z0)
    - Point B (x1, y1, z1)

    Ce que je dois arriver à faire :
    - Construire le vecteur AB (dont le sens est A -> B)
    - Construire la perpendiculaire de AB contenant le point A. Cette perpendiculaire doit démarrer en A et s'arrêter en un point C(x2,y2,z2)
    - Cette perpendiculaire doit suivre la règle de la main droite

    Où j'en suis :
    - Vecteur AB créé
    - Calcul théorique de la droite perpendiculaire à la droite AB et passant par A :
    d = (x-x0)/((1/2)*(x1-x0)) = (y-y0)/((1/2)*(y1-y0)) = (z-z0)/((1/2)*(z1-z0))

    Ce que je n'arrive pas à faire :
    - J'ai ma droite théorique. Mais pour la dessiner, il faut récupérer un point C de cette droite => Je ne vois pas comment faire
    - Quand j'aurais mon point C, il sera facile de dessiner le vecteur AC. Mais comment vérifier que AC est la perpendiculaire qui suit la règle de la main droite ? => Je ne vois pas comment faire
    Tout se joue sur le calcul du point C et malgré mes recherches, je n'y arrive pas.

    Je vous remercie dores et déjà pour toute aide

    Cordialement,
    Moi.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Le vecteur directeur de AB est (x1-x0, y1-y0, z1-z0).
    Le vecteur directeur de AC est (x2, y2, z2).
    Pour que AB et AC soient perpendiculaire, il faut que la condition(produit scalaire) : (x1-x0) * x2 + (y1-y0) * y2 + (z1-z0) * z2 = 0
    On peut donc choisir x2 = (1/2) / (x1-x0); y2 = (1/2) / (y1-y0); z2 = (-1) / (z1 - z0).
    En effet : (x1-x0) * (1/2) / (x1-x0) + (y1-y0) * (1/2) / (y1-y0) + (z1-z0) * (-1) / (z1 - z0) = 1/2 + 1/2 - 1 = 0.

    On sait que les équations paramétriques de la droite passant par AC est alors :
    x = x0 + k * x2
    y = y0 + k * y2
    z = z0 + k * z2
    (avec k un Réel)
    Ca, ça me permet donc de trouver un point de la droite perpendiculaire.

    Mais je ne sais pas quel point choisir pour que la règle de la main droite soit satisfaite.

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,
    avant d'aller plus loin : ton problème n'est pas assez bien contraint. Il existe une infinité de points C tels que AB et AC soit normaux. En gros, tous les points du plan passant par A dont la normale est AB.

    Il te faut :
    • Choisir une direction particulière pour AC
    • Choisir une norme pour AC (1 ou AB pourrait convenir).


    Pour rappel : la "règle de la main droite" n'est qu'un moyen mnémotechnique pour différencier un trièdre direct d'un trièdre indirect. Elle n'a aucun sens sur un bièdre (j'appelle vocabulary-man pour m'aider sur ce point).

    Cordialement,
    -- Yankel Scialom

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Je dois alors faire quelque chose de faux.

    En fait, j'ai déjà solution à mon problème.
    A savoir que j'utilise les propriétés du produit scalaire pour trouver C.
    Puis une fois que j'ai AB et AC, je fais leur produit vectoriel pour trouver AD.
    Ainsi, je peux dessiner les axes locaux(ici vu comme vecteurs) d'un objet 3D.

    Quand je bouge mon objet 3D, les axes AB et AD restent inchangés(donc bon). Cependant, l'axe AC varie. Un peu il va d'un côté un peu de l'autres.
    Donc je me suis dis que je devais faire une erreur sur la procédure de calculs de mes axes..

    Voici comment sont calculés les axes(vecteurs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    				// A(POINT 3D), X0(réel), Y0(réel) et Z0(réel) donnés
    				B, C, D : POINT 3D
     
    				// Calcul de B
    				B.x = A.x + X0
    				B.y = A.y + Y0
    				B.Z = A.Z + Z0
     
    				// Calcul de C
    				If (X0 = 0 And Y0 = 0 And Z0 != 0) Then
    					C.x = A.x + Z0
    					C.y = A.y
    					C.Z = A.Z
    				End If
    				If (X0 = 0 And Y0 != 0 And Z0 = 0) Then
    					C.x = A.x + Y0
    					C.y = A.y
    					C.Z = A.Z
    				End If
    				If (X0 = 0 And Y0 != 0 And Z0 != 0) Then
    					C.x = A.x
    					C.y = A.y - Z0
    					C.Z = A.Z + Y0
    				End If
    				If (X0 != 0 And Y0 = 0 And Z0 = 0) Then
    					C.x = A.x
    					C.y = A.y + X0
    					C.Z = A.Z
    				End If
    				If (X0 != 0 And Y0 = 0 And Z0 != 0) Then
    					C.x = A.x + Z0
    					C.y = A.y
    					C.Z = A.Z - X0
    				End If
    				If (X0 != 0 And Y0 != 0 And Z0 = 0) Then
    					C.x = A.x + Y0
    					C.y = A.y - X0
    					C.Z = A.Z
    				End If
    				If (X0 != 0 And Y0 != 0 And Z0 != 0) Then
    					C.x = A.x + 1 / X0
    					C.y = A.y + 1 / Y0
    					C.Z = A.Z - 2 / Z0
    				End If
     
    				// Calcul de D
    				D.x = (B.y - A.y) * (C.z - A.z) - (B.z - A.z) * (C.y - A.y)
    				D.y = (B.z - A.z) * (C.x - A.x) - (B.x - A.x) * (C.z - A.z)
    				D.z = (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x)

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bon, revenons à ton premier message.

    Citation Envoyé par zizoufoot Voir le message
    Voici les données qui me sont disponibles :
    - On travaille dans l'espace
    - Point A (x0, y0, z0)
    - Point B (x1, y1, z1)

    Ce que je dois arriver à faire :
    - Construire le vecteur AB (dont le sens est A -> B)
    - Construire la perpendiculaire de AB contenant le point A. Cette perpendiculaire doit démarrer en A et s'arrêter en un point C(x2,y2,z2)
    - Cette perpendiculaire doit suivre la règle de la main droite
    Voici ce que je propose : On cherche un point C tel que . Cette égalité est équivalente à
    . Nous avons trois inconnues pour une seule équation. Mais comme on n'a aucune contrainte sur C, on peut fixer deux d'entre elles : . Ce qui nous amène à



    Une fois que tu as C, tu peux calculer D comme tu le fais () de sorte que le trièdre soit direct.


    Un soucis qui se pose en revanche est celui des normes des vecteurs. Il te faudra peut être les normaliser si tu veux les afficher proprement. Si tu travailles avec un langage un tant soit peu évolué (comprendre objet ou fonctionnel), je te conseille de te faire une classe vecteur pour gérer tous ces calculs peu élégants lorsqu'exprimés en une seule ligne.


    Cdlt,
    -- Yankel Scialom

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    OMG !

    C'est bon, je sais pourquoi il y avait une erreur.. Il n'y en avait pas.
    Mon objet 3D est assez volumineux et lourds à calculer. Du coup, quand on déplace cet objet, le déplacement se fait en lagant.
    L'erreur, tiens toi bien, c'est que je confondais le dessous du dessus. En effet, quand on déplace l'objet 3D, on ne sait pas faire la différence entre le dessous du dessus.. Et du coup, je regardais les axes des noeuds à côté renversé qui me donnaient l'illusion que l'axe se retournait.. Je viens de confirmer mon erreur.

    Toute une histoire pour un problème si bête.

    Merci tout de même

    Bien à toi,
    moi.

    Edit : Y a t il une balise autres que résolu pour dire "résolu mais omg l'auteur est un abruti" ?

  7. #7
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par zizoufoot Voir le message
    Edit : Y a t il une balise autres que résolu pour dire "résolu mais omg l'auteur est un abruti" ?


    Non mais tu peux en faire la demande ici.
    -- Yankel Scialom

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/09/2012, 17h50
  2. Nommer un process via le main
    Par Nalfeim dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 27/03/2009, 09h50
  3. Repère main gauche à repère main droite
    Par Bob.Killer dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2008, 16h09
  4. Réponses: 4
    Dernier message: 20/08/2006, 17h21
  5. Obtenir des droits Windows via une page ASP
    Par hysteresis dans le forum ASP
    Réponses: 2
    Dernier message: 31/08/2005, 10h31

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