L'Algorithme pour Trouver le Point d'Intersection de Deux 3D Segment de Ligne

Trouver le point d'intersection de deux 2D segment de ligne est facile; la formule est simple. Mais trouver le point d'intersection de deux 3D segment n'est pas, j'ai peur.

Qu'est-ce que l'algorithme en C# de préférence qui trouve le point d'intersection de deux 3D segments de ligne?

J'ai trouvé un Implémentation C++ ici. Mais je ne vous fiez pas la solution car il fait de la préférence d'un certain plan ( à la façon de perp est mis en œuvre en vertu de la section mise en œuvre, il suppose une préférence pour z plane. Tout algorithme générique ne doit pas penser que n'importe quel plan de l'orientation ou de préférence).

Est-il une meilleure solution?

  • Vous trouverez peut-être utile de prendre un coup d'oeil à un article correspondant de Wikipedia - ce n'est pas un code, mais l'algorithme est décrit assez bien, à mon humble avis (mais vous devez savoir de maths de toute façon). en.wikipedia.org/wiki/Bentley%e2%80%93Ottmann_algorithm Update: c'est marrant, c'est que la version russe de la même entrée de Wikipedia contient plus de détails (et de la formule) et une description d'algorithme est de la pseudo-code. Voici un lien pour la traduction de cette entrée à l'anglais (via Google Translate): translate.google.com/...
  • J'aime les maths dans votre réponse, mais je ne pense pas que votre déclaration à propos d'un algorithme générique est vrai. La projection de l'lignes sur le plan xy permettra de transformer le problème en un problème 2d. Ensuite, trouver l'intersection de la suite de points ou de lignes et de tester sa validité. Le choix de z est juste de la mise en œuvre de commodité. De travail dans une dimension inférieure pourrait réduire le nombre de fonctionnement, trop.
  • Je ne suis pas sûr de savoir si la projection des lignes sur le plan xy est une bonne idée. Considérez ceci en supposant que les deux x-y les lignes, chacune située sur les différents z avions. Si vous projet pour les plans xy ensuite ils semblent être croisées, même s'ils ne le sont pas.
  • Bientôt Hui, Oui, c'est correct. Après la détermination de l'intersection dans le plan xy, vous auriez besoin de tester sa validité. C'est juste une question de "brancher les chiffres de". L'avantage est que si les chiffres ne vérifient pas, alors vous pouvez conclure que les lignes ne se croisent pas. Remarque: vous devez gérer un couple de cas particuliers (une ligne est dirigé le long de z-chapeau, des lignes parallèles). Sur une note connexe, la solution que vous avez posté ci-dessous suppose que les lignes sont infinies. Vous aurez besoin de faire un test de validation de cette solution, ainsi.
  • ma solution serait plus facile et plus propre à mettre en oeuvre car j'ai juste besoin de vérifier pour a et b doit être comprise entre 0 et 1
  • PAS de. J'ai peur d'avoir tort. La projection dans un plan 2d peut facilement échouer, même si une solution existe. Considérons deux segments de ligne, dont au moins une est parallèle à l'axe z. Maintenant, la projection sera un point.
  • C'était il y a quelques temps et je crois que j'ai eu tort de parler de l'infini de lignes. D'autres commentaires semblent avoir manqué la partie où j'ai dit à vérifier la projection de l'intersection. Cette procédure échoue pour deux finis segments bout à bout de ce projet pour les points et qui ne se coupent, comme les copeaux de bois, fait allusion à l'. Je m'en excuse. Mais si son infinie lignes, je pense que mon affirmation est correcte. Notez également que mon commentaire n'était pas destiné à être un algorithme efficace, juste un contre-exemple.
  • Btw, le problème peut être simplifié si la 3ème dimension est supprimé. Dans certains cas, vous pouvez travailler avec les projets de deux lignes 3D sur le même plan, donc de réduire le problème à sa dimensionnelle 2D équivalent.

InformationsquelleAutor Graviton | 2010-02-23