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 :

Calculer le point d’intersection de deux segments dans un espace 3D


Sujet :

Algorithmes et structures de données

  1. #21
    Membre expérimenté
    Les segments qui relient l'oeil (qui a bougé ) à l'objet ( qui n'a pas bougé ) se coupent forcément à l'objet.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  2. #22
    Expert éminent sénior
    Citation Envoyé par Pecose Voir le message
    Oui parce que tu as modifier la distance entre la photo et la prise de vue.
    Cette distance doit être prise arbitrairement puisque qu'elle n'existe pas dans le monde réel.
    Mais elle doit être prise une fois pour toute et suffisamment grande simuler que la photo est très loin de la prise de vue.
    Sinon effectivement on se retrouvent avec des aberrations.
    Ceci est doublement faux. Un zoom aboutira au même résultat que de modifier cette distance. Et même si on prend pour contrainte de garder le zoom identique, donc une distance identique, alors il y a quand même une infinité de cas possibles.

    Voici le démenti en image :



    Les points n'ont pas bougé, les photos sont identiques, la distance est constante et les objets sont différents.

    Enfin, j'ajoute qu'assimiler l'objet à un segment est douteux. On ne peut pas travailler sur les points dans l'objet car ils pourraient bien se trouver derrière le segment et non dessus.

    [edit] posts croisés [/edit]
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #23
    Membre habitué
    Citation Envoyé par Nebulix Voir le message
    Les segments qui relient l'oeil (qui a bougé ) à l'objet ( qui n'a pas bougé ) se coupent forcément à l'objet.
    En fait non, dans ce cas pas forcement, parce que la position de l'objet sur l'image n'est pas super précise.
    Elle est calculer par un réseau de neurone.
    Du coup, d'une image sur l'autre il ce peut qu'il y ai un léger décalage.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  4. #24
    Membre habitué
    Citation Envoyé par Flodelarab Voir le message
    Ceci est doublement faux.
    Sur mon smartphone, j'ai un accéléromètre et un gyroscope, ce qui fait que j'ai la position mais aussi l'orientation.
    Dans ton exemple tu modifie l'orientation des points de vue, du coup oui, on tombe sur un résultat différent à chaque fois.
    Mais moi je n'aurai pas une orientation mole comme dans ton exemple.
    Elle sera déterminer par les données de mon gyroscope.

    Et pour le zoom tu as tout à fait raisons, je n'ai pas su trouver les mots pour l'expliquer.
    Du coup je reprend tes mots:
    Il faut garder un distance, un zoom et un orientation fixe.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  5. #25
    Expert confirmé
    Citation Envoyé par Pecose Voir le message

    Quelqu'un peut t'il m'expliquer y = ax+b?
    c'est l’équation d'une droite dans un systeme 2D
    une fonction que tu dois connaitre a partir du collège si mes souvenir sont correcte

    le a correspondant au coefficient directeur de la droite et le b une constante

    exemple => Pour l’équation :
    Y = 2x+ 3

    si X = 1 | y = 2*1+3 = 5
    si X = 3 | y = 2*3+3 = 9
    si X = 7 | y = 2*7+3 = 17 ...

    on peut donc dire que ta droite passe
    Par les points (1,5) et (7,17)
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #26
    Membre habitué
    Citation Envoyé par anapurna Voir le message
    c'est l’équation d'une droite dans un systeme 2D
    une fonction que tu dois connaitre a partir du collège si mes souvenir sont correcte
    J'me suis arrêter en troisième mais on peut pas vraiment dire que j'ai fait le collège...
    J'ai plutôt fait une année de 64 et deux de Gamecube.

    Merci pour ta une réponse très claire en tout cas.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  7. #27
    Membre expérimenté
    Citation Envoyé par Pecose Voir le message
    En fait non, dans ce cas pas forcement, parce que la position de l'objet sur l'image n'est pas super précise.
    Elle est calculer par un réseau de neurone.
    Du coup, d'une image sur l'autre il ce peut qu'il y ai un léger décalage.
    L'incertitude sur la position de l'image de l'objet sur le capteur entrainera une incertitude sur la distance.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  8. #28
    Membre habitué
    Citation Envoyé par Nebulix Voir le message
    L'incertitude sur la position de l'image de l'objet sur le capteur entrainera une incertitude sur la distance.
    Tout à fait juste, mais c'est pas grave.
    Si je peux obtenir un distance incertaine ça me fait toujours une distance que je pourrai affinée plus tard.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  9. #29
    Membre chevronné
    Calculer le point d’intersection de deux segments dans un espace 3D
    Citation Envoyé par Pecose Voir le message
    ... En fait j'ai déjà réaliser une simulation en 2D qui fonctionne avec uniquement la position, l’orientation du smartphone et la position de l'objet sur les images. Je n'ai besoin de rien d'autre pour trouver la position de l'objet dans l'espace ...
    Tu disposes donc à priori:
    a) des coordonnées (Xi,Yi) des positions (C1, C2) des deux centres optiques ;
    b) des angles définissant les orientations des axes optiques;
    c) des coordonnées d'un point de l'objet.

    On finira bientôt par tout savoir ...
    Et comment cette réalisation a-t-elle été obtenue ? Par un programme fait main, ou à l'aide d'un logiciel ? Et obtiens-tu des résultats satisfaisants ?

    Citation Envoyé par Pecose Voir le message
    ... Mon problème intervient lorsque je passe à la 3D, puisque les segments qui relient l’œil à l'image ne se croisent pas forcement ...
    Il faut d'abord travailler sur les projections verticales des points de l'objet sur un plan horizontal. Le reste viendra facilement.

    Citation Envoyé par Pecose Voir le message
    ... Quelqu'un peut-il m'expliquer y = ax+b ?
    Il s'agit de l'équation cartésienne d'une droite, c'est à dire de la relation intervenant entre les coordonnées (x, y) d'un point quelconque de la droite considérée; les constantes (a, b) caractérisent cette droite.
    PS: voir anapurna.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  10. #30
    Expert éminent sénior
    On est revenu au point de départ.
    Il y a 2 vecteurs en 3d pour le coin supérieur gauche et 2 vecteurs en 3d pour le coin inférieur droit. On peut donc prendre la solution que j'évoquais dans le message #6.

    La notion un peu ardue est sûrement le produit vectoriel. Mais Wikipedia, à la page "Produit Vectoriel", au paragraphe "Calcul en composantes", donne la solution.
    Astuce : Si le vecteur directeur est [latex]\vec{n}(a;b;c)[/latex] alors l'équation du plan est ax+by+cz+d=0. Il n'y a plus que "d" à trouver. Mais il suffit de remplacer x y z par les coordonnées d'un point du plan pour trouver l'équation complète du plan.

    Il y a un peu de boulot mais le chemin est tout tracé.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #31
    Membre à l'essai
    Balayage
    Il faut créer un troisième segment formé par un point P de la droite AB et un point Q de la droite CD En faisant un balayage jusqu'a trouver PQ de longueur minimum.
    On peut guider le balayage en indiquant que le segment PQ doit être perpendiculaire aux segment AB et CD. Le point chercher est (produit scalaire nul) le milieu de PQmin

  12. #32
    Membre à l'essai
    Code C#
    Code C# :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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    using System;
     
    namespace Intersection_de_deux_segments_en_3D
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Segments AB et CD
                // Coordonnées de A, B, C, D
                float xA = 0.0f, yA = 0.0f, zA = 0.0f;
                float xB = 10.0f, yB = 2.0f, zB = -1.0f;
                float xC = 8.0f, yC = 0.0f, zC = 1.0f;
                float xD = 5.0f, yD = 2.0f, zD = 5.0f;
     
                // Ecarts de oordonnées entre A et B et entre C et D
                float dxAB = xB - xA, dyAB = yB - yA, dzAB = zB - zA;
                float dxCD = xD - xC, dyCD = yD - yC, dzCD = zD - zC;
                // Ecarts de oordonnées entre A et C et entre B et D
                float dxAC = xC - xA, dyAC = yC - yA, dzAC = zC - zA;
                float dxBD = xD - xB, dyBD = yD - yB, dzBD = zD - zB;
                // Coeficient des équations linéaires en rP et rQ
                float aPP, aPQ, aQP, aQQ, bP, bQ;
                //      aPP * rP + aPQ * rQ = bP
                aPP = dxAB * dxAB + dyAB * dyAB + dzAB * dzAB;
                aPQ = -dxAB * dxCD - dyAB * dyCD - dzAB * dzCD;
                bP = dxAC * dxAB + dyAC * dyAB + dzAC * dzAB;
                //      aQP * rP + aQQ * rQ = bQ
                aQP = dxCD * dxAB + dyCD * dyAB + dzCD * dzAB;
                aQQ = -dxCD * dxCD - dyCD * dyCD - dzCD * dzCD;
                bQ = dxAC * dxCD + dyAC * dyCD + dzAC * dzCD;
     
                // Résolution du système (méthode de Cramer)
                float rP, rQ, detA, detP, detQ;
                detA = aPP * aQQ - aQP * aPQ;
                detP = bP * aQQ - bQ * aPQ;
                detQ = aPP * bQ - aQP * bP;
                rP = detP / detA;
                rQ = detQ / detA;
     
                // Coordonnées de P et Q
                float xP, yP, zP, xQ, yQ, zQ;
                xP = xA + rP * dxAB;
                yP = yA + rP * dyAB;
                zP = zA + rP * dzAB;
                xQ = xC + rQ * dxCD;
                yQ = yC + rQ * dyCD;
                zQ = zC + rQ * dzCD;
                // Coordonnées de M, le point cherché
                float xM, yM, zM;
                xM = (xP + xQ) / 2;
                yM = (yP + yQ) / 2;
                zM = (zP + zQ) / 2;
                // sorties écran
                Console.WriteLine("xM = "+ xM);
                Console.WriteLine("yM = " + yM);
                Console.WriteLine("zM = " + zM);
                Console.Read();