Partage
  • Partager sur Facebook
  • Partager sur Twitter

projection points 3D -> Plan.

la projection.

    8 juillet 2011 à 22:13:17

    Salut,

    Tout d'abord je souhaite préciser que je suis en 1ère donc que j'ai un niveau en maths moindre.

    En fait, mon but est de projeter des points d'un repère 3D sur un plan. Alors j'ai cherché et cherché sur la toile et j'aimerais que vous vérifiez si ma méthode est correcte.

    Je définie le plan P via le point A(a1, a2, a3) appartenant à ce plan et le vecteur N(n1, n2, n3) normal à ce plan. Je souhaite projeter le point M(m1, m2, m3) orthogonalement au plan P. j'ai : P(M) = M' de coord inconnue (x, y, z)

    le plan P a pour équation :
    <math>\(ax + by + cz + d = 0.~\)</math>
    Autrement dit :
    <math>\(n_1x+n_2y+n_3z-(n_1a_1+n_2a_2+n_3a_3) = 0.~\)</math>

    D'autre part on a

    <math>\($\overrightarrow{MM'}$ = k.$\overrightarrow{N}$\)</math>
    <math>\(\[ \left( \begin{array}{ c } x - m1 \\ y - m2 \\ z - m3 \\ \end{array} \right) = k. \left(\begin{array}{ c }n1 \\ n2 \\ n3 \\\end{array} \right)\]\)</math>

    Ce qui me donne le système :
    <math>\(\left\{ \begin{array}{rcr} x & = & k.n1 + m1 \\ y & = & k.n2 + m2 \\ z & = & k.n3 + m3 \\ \end{array} \right.\)</math>

    Ensuite il ne reste plus qu'à remplacer dans l'équation du plan P pour isoler et trouver le k unique. Je remplace le k dans le système pour trouver les x, y, z soit les coordonnées de M' dans l'espace.

    Mais voilà c'est bien ça le problème et c'est d'ailleurs là que j'aimerais comprendre.
    On a fait le projeté de M sur le plan P, ainsi M' appartient au plan P. Moi ce que j'aimerais, c'est les coordonnées de M' non pas dans l'espace mais par rapport au référentiel du plan c'est à dire les coord 2D.

    Voilà j'aimerais savoir comment on peut faire cela, c'est dans le but justement de reprèsenter à l'écran des figures en 3D. Merci à vous. ++

    Merci à vous.
    • Partager sur Facebook
    • Partager sur Twitter
      8 juillet 2011 à 22:36:19

      Ça ressemble au problème énoncé ici. Voila ce que j'avais répondu.

      Citation : Moi même dans un autre post

      Une solution (par forcément pratique à mettre en place) est de trouver une base orthonormée du plan dans lequel tu veux travailler (il doit y en avoir une infinité, qu'on doit pouvoir trouver en utilisant le vecteur normal au plan). Ensuite tu n'as plus qu'à exprimer les coordonnées de tes points dans cette nouvelle base (ce qui se fait facilement en effectuant deux produits scalaires ou, ce qui revient au même, de multiplier par une matrice "de passage" 2x3 contenant sur chacune des deux lignes les coordonnées des deux vecteurs choisis comme base), puis utiliser les formules valables dans le plan.



      Il te suffit d'appliquer cette méthode une fois que tu as trouvé les coordonnées dans l'espace de M' avec ta méthode.

      Par contre, il y a une méthode plus rapide et moins calculatoire (encore que, il faut trouver une base de ton plan) que celle que tu utilises, mais je n'ai pas vraiment le temps de la détailler ce soir. En gros, c'est une variante de ce qui se trouve dans la citation, une fois que tu as trouver une base orthonormée de ton plan (c'est-à-dire deux vecteurs <math>\(\vec{u}\)</math> et <math>\(\vec{v}\)</math> unitaires et orthogonaux appartenant à ton plan), et en considérant que ton point A est l'origine du repère dans ton plan, tu as juste à calculer les deux produits scalaires <math>\(\vec{AM}.\vec{u}\)</math> et <math>\(\vec{AM}.\vec{v}\)</math> pour obtenir les coordonnées que tu cherches.
      • Partager sur Facebook
      • Partager sur Twitter
        8 juillet 2011 à 23:04:11

        En l'état, tu ne peux pas car ton plan n'est pas munis d'un repère. Tu dois choisir arbitrairement un vecteur e1 inclus dans ton plan. Ensuite, il te manque un vecteur pour avoir une base. Le mieux étant d'avoir une base orthogonale (on a rarement vu des écrans avec une forme de parallélogramme non rectangulaire). Ce vecteur est facilement calculable c'est le produit vectoriel de e1 et de n que j'appelle e2 (je te renvoi à Wikipédia, rien de bien compliqué à calculer).
        Il faut ensuite exprimé les coordonnées de M' dans le repère (A, e1, e2, n).
        OM' = (x', y', z') = OA + AM'
        Donc AM' = (x' - a1, y' - a2, z' - a3) (Dans le repère (O, i, j, k) usuel)
        Or:
        n = n1 * i + n2 * j + n3 * k
        e1 = e11 * i + e12 * j + e13 * k
        e2 = e21 * i + e22 * j + e23 * k
        En inversant le système, on obtient i, j et k en fonction de n, e1 et e2... Je te renvoi sur n'importe quel écrit d'inversion de système (ou de matrice :-° )
        De la vu que AM' = (x' - a1) * i + (y' - a2) * j + (z' - a3) * k, tu remplaces i, j et k par leurs expressions en fonction de n, e1 et e2 et les coefficients devant e1 et e2 sont les coordonnées que tu cherches.

        Matriciellement:
        <math>\(X = \left( \begin{array}{c} x' - a_1 \\ y' - a_2 \\ z' - a_3 \end{array} \right)\)</math>
        <math>\(P = \left( \begin{array}{c c c} n_1 & e11 & e21 \\ n_2 & e12 & e22 \\ n_3 & e13 & e23 \end{array} \right)\)</math>
        <math>\(X' = P^{-1} X = \left( \begin{array}{c} x \\ y \\ osef \end{array} \right)\)</math>

        Citation : rushia

        Par contre, il y a une méthode plus rapide et moins calculatoire (encore que, il faut trouver une base de ton plan) que celle que tu utilises, mais je n'ai pas vraiment le temps de la détailler ce soir. En gros, c'est une variante de ce qui se trouve dans la citation, une fois que tu as trouver une base orthonormée de ton plan (c'est-à-dire deux vecteurs et unitaires et orthogonaux appartenant à ton plan), et en considérant que ton point A est l'origine du repère dans ton plan, tu as juste à calculer les deux produits scalaires et pour obtenir les coordonnées que tu cherches.


        *Va se pendre
        • Partager sur Facebook
        • Partager sur Twitter
          8 juillet 2011 à 23:59:47

          Citation : rushia

          Par contre, il y a une méthode plus rapide et moins calculatoire (encore que, il faut trouver une base de ton plan) que celle que tu utilises, mais je n'ai pas vraiment le temps de la détailler ce soir. En gros, c'est une variante de ce qui se trouve dans la citation, une fois que tu as trouver une base orthonormée de ton plan (c'est-à-dire deux vecteurs <math>\(\vec{u}\)</math> et <math>\(\vec{v}\)</math> unitaires et orthogonaux appartenant à ton plan), et en considérant que ton point A est l'origine du repère dans ton plan, tu as juste à calculer les deux produits scalaires <math>\(\vec{AM}.\vec{u}\)</math> et <math>\(\vec{AM}.\vec{v}\)</math> pour obtenir les coordonnées que tu cherches.



          J'ai déjà essayé de faire quelque chose comme ça, Green (de la visualisation d'un truc en 3D). C'est cette méthode qui est la bonne (sauf si tu fais quelque chose d'incroyablement particulier, en toute généralité pour "regarder" quelque chose sans déformation, tu cherches à le projeter sur un plan que tu décriras facilement par une base orthonormée), parce qu'elle est plus simple à comprendre et, disons, plus rapide à mettre en œuvre (bien qu'en terme de calcul ce soit rigoureusement la même chose que la solution matricielle).


          Plus précisément, si tu pars de ton point <math>\(A(a_1, a_2, a_3)\)</math> et de ton vecteur normal <math>\(\vec{n}(n_1, n_2, n_3)\)</math>, il faut commencer par trouver une base de ton plan. Une base orthonormée s'obtient "facilement" en considérant par exemple les deux vecteurs orthogonaux <math>\(\vec{u'}(n_2, -n_1, 0)\)</math> et <math>\(\vec{v'}\left( n_1 n_3, n_2 n_3, - (n_1^2 + n_2^2) \right)\)</math> (tu peux vérifier que <math>\(\vec{n} \cdot \vec{u'} = 0\)</math>, <math>\(\vec{n} \cdot \vec{v'} = 0\)</math> et <math>\(\vec{u'} \cdot \vec{v'} = 0\)</math>), puis les vecteurs orthonormaux <math>\(\vec{u} = \frac{\vec{u'}}{|| \vec{u'} ||} = \left( \frac{n_2}{\sqrt{n_1^2 + n_2^2}}, \frac{-n_1}{\sqrt{n_1^2 + n_2^2}}, 0 \right)\)</math> et <math>\(\vec{v} = \frac{\vec{v'}}{|| \vec{v'} ||} = \left( \frac{n_1 n_3}{\sqrt{(n_1^2 + n_2^2)(n_1^2 + n_2^2 + n_3^2)}}, \frac{n_2 n_3}{\sqrt{(n_1^2 + n_2^2)(n_1^2 + n_2^2 + n_3^2)}}, - \frac{n_1^2 + n_2^2}{\sqrt{(n_1^2 + n_2^2)(n_1^2 + n_2^2 + n_3^2)}} \right)\)</math>qui te donnent la base que tu cherches (à condition que <math>\((n_1, n_2) \neq (0, 0)\)</math>, sinon il faut choisir les coordonnées autrement).

          Ceci étant fait, tu as les coordonnées des deux vecteurs <math>\(\vec{u}, \vec{v}\)</math> de ta base, donc tu peux facilement calculer leur produit scalaire avec n'importe quel vecteur, donc obtenir les coordonnées de n'importe quel point dans une base <math>\((A, \vec{u}, \vec{v})\)</math> orthonormée de ton plan orthogonal à <math>\(\vec{n}\)</math> passant par <math>\(A\)</math> : pour le point <math>\(P(x, y, z)\)</math>, il s'agit des nombres <math>\(\vec{AP} \cdot \vec{u} = \frac{(x - a_1) n_2 - (y - a_2) n_1}{\sqrt{n_1^2 + n_2^2}}\)</math> (selon l'axe <math>\(\vec{u}\)</math>) et <math>\(\vec{AP} \cdot \vec{v} = \frac{(x - a_1) n_1 n_3 + (y - a_2) n_2 n_3 - (z - a_3) (n_1^2 + n_2^2)}{\sqrt{(n_1^2 + n_2^2)(n_1^2 + n_2^2 + n_3^2)}}\)</math> (selon l'axe <math>\(\vec{v}\)</math>).

          Oui, j'ai sorti beaucoup de formules compliquées, parce que j'ai voulu te montrer que c'était calculable directement et te donner les formes développées ; mais si tu calcules <math>\(\vec{u'}, \vec{v'}\)</math> puis <math>\(|| \vec{u'} ||\)</math> et <math>\(|| \vec{v'} || = || \vec{n} || || \vec{u'} ||\)</math> puis enfin <math>\(\vec{u}\)</math> et <math>\(\vec{v}\)</math> en fait il n'y a pas tant de calculs que ça, et selon la forme de <math>\(\vec{n}\)</math> il peut même y avoir des formules encore plus directes.

          J'ai donné directement les résultats parce que je ne connais pas bien ton niveau et parce que les calculs ne sont pas passionnants seuls ; mais si tu ne comprends pas bien quelque chose (notamment d'où sortent les coordonnés de <math>\(\vec{v'}\)</math>, qui ne sont pas choisies au hasard) et que cela t'intéresse d'en savoir plus, n'hésite pas à demander. Note que ma solution a un gros défaut, c'est qu'elle doit être adaptée selon que <math>\((n_1, n_2) = (0, 0)\)</math> ou non, ce qui certes n'arrive pas forcément, mais si c'est le cas c'est pénible. Dans ce cas, il me paraît plus simple (étonnamment) de faire des calculs plus spécifiques selon la forme de <math>\(\vec{n}\)</math> (s'il a une forme particulière, par exemple s'il est décrit par des coordonnées sphériques, ce qui peut être le cas selon ta méthode).
          • Partager sur Facebook
          • Partager sur Twitter
            9 juillet 2011 à 3:43:14

            Tout d'abord je vous remercie pour vos réponses rapides et surtout très construites. ça à l'air de fonctionner.

            A vrai dire je n'ai qu'un niveau de 1ere en maths mais avec un peu de recherche complémentaire sur la toile depuis quelques jours déjà j'ai pu me documenter d'avantage sur la géométrie dans l'espace ce qui fait que je comprend à peu près xD.

            En effet j'ai mis du temps à comprendre pourquoi tu faisait v = v' / norme(v') et j'ai compris seulement après que tu avais créer un vecteur pour ne pas être obligé à diviser par la norme de v' lors du produit scalaire xD.

            Sinon Locke oui j'ai bien compris l'histoire de la définition des vecteur orthogonaux. En effet on sait que deux vecteurs orthonormé donne un produit scalaire égal à 0. On peut ainsi donner définir les coordonnées des vecteur v' et u' en fonction de n et d'un des deux autres pour le troisième.

            Et sinon, oui j'ai fais quelques test à l'aide de la SDL. Ces derniers ont l'air de bien fonctionner à première vue.


            Par contre, je n'ai pas aborder les matrices, je sais que l'on peut projeter des points de l'espace sur un plan tout ça à l'aide d'une matrice de projection... mais je ne me suis pas encore renseigné là dessus. J'ai plutôt voulu le faire manuellement avec les vecteurs pour commencer. Toutefois j'accepte tout renseignements de votre part.

            En tout cas Merci infiniment pour votre aide.
            ++
            • Partager sur Facebook
            • Partager sur Twitter
              18 juillet 2011 à 16:54:30

              Juste une question que j'aimerais vous poser :
              Et à partir de ce moment la, comment peut-on récupérer les coordonnées 3D de M' sur le plan ?


              J'avais pensé à résoudre le système d'équation contenant : l'équation du Plan + les deux produits scalaires de Locke.
              Ainsi on retrouverai peut-être M'(x ; y ; z). Cependant, peut-être que cette méthode est beaucoup trop fastidieuse.

              D'autre part si il existe une méthode qui est plus simple à mettre en oeuvre, n'hésitez pas à la rendre explicite sur ce topic.

              Merci d'avance.
              Green.
              • Partager sur Facebook
              • Partager sur Twitter
                18 juillet 2011 à 19:25:50

                Si M' = <math>\((\alpha,\: \beta)\)</math> dans <math>\((A,\: \vec{u}, \: \vec{v})\)</math>
                Tu as:
                <math>\(\vec{OM'} = \vec{OA} + \alpha \vec{u} + \beta \vec{v}\)</math>

                <math>\(\vec{OM'} = \left( \begin{array}{c}a1 + \frac{\alpha n_2}{\sqrt{n_1^2 + n_2^2}} + \frac{\beta n_1 n_3}{\sqrt{(n_1^2 + n_2^2)(n_1^2 + n_2^2 + n_3^2)}} \\a2 - \frac{\alpha n_1}{\sqrt{n_1^2 + n_2^2}} + \frac{\beta n_2 n_3}{\sqrt{(n_1^2 + n_2^2)(n_1^2 + n_2^2 + n_3^2)}} \\a3 - \frac{\beta n_1^2 + n_2^2}{\sqrt{(n_1^2 + n_2^2)(n_1^2 + n_2^2 + n_3^2)}} \end{array}\right)\)</math>
                • Partager sur Facebook
                • Partager sur Twitter

                projection points 3D -> Plan.

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown