3D Ligne d'Intersection des plans
Si une ligne (représenté par un vecteur ou deux points sur la ligne) comment puis-je trouver le point où la ligne croise un avion? J'ai trouvé énormément de ressources sur ce sujet, mais je ne peux pas comprendre les équations de là (ils ne semblent pas être la norme algébrique). Je voudrais une équation (peu importe combien de temps) qui peut être interprété par un langage de programmation standard (je suis à l'aide de Java).
- double possible de stackoverflow.com/questions/4382591/line-plane-intersection
- Ce n'est pas un doublon, 4382591 n'est pas de poser des questions sur le cas général.
Vous devez vous connecter pour publier un commentaire.
Voici une méthode en Java qui trouve l'intersection entre une droite et d'un plan. Il vecteur des méthodes qui ne sont pas inclus, mais leurs fonctions sont assez explicites.
Heres un exemple Python qui trouve à l'intersection d'une droite et d'un plan.
Où l'avion peut être soit un point et un normal, ou un vecteur 4d (forme normale),
Dans les exemples ci-dessous (code pour les deux sont fournis).
Également noter que cette fonction calcule une valeur représentant l'endroit où le point est sur la ligne, (appelé
fac
dans le code ci-dessous). Vous pouvez retourner ce trop, parce que les valeurs de 0 à 1 en intersection avec le segment de ligne - ce qui peut être utile pour l'appelant.D'autres détails à noter dans le code-commentaires.
Remarque: Cet exemple utilise les fonctions pures, sans dépendances - pour le rendre facile à se déplacer vers d'autres langues. Avec un
Vector
type de données et la surcharge d'opérateur, il peut être plus concis (inclus dans l'exemple ci-dessous).Si l'avion est défini comme un vecteur 4d (forme normale), nous avons besoin de trouver un point sur le plan, puis de calculer l'intersection avant (voir
p_co
affectation).Pour référence ultérieure, ceci a été pris à partir de Blender et adapté à Python.
isect_line_plane_v3()
dans math_geom.cPour plus de clarté, voici les versions utilisant le mathutils API (qui peut être modifié pour d'autres bibliothèques de mathématiques avec la surcharge d'opérateur).
Vous aurez besoin de considérer trois cas:
Vous pouvez exprimer la ligne dans paramaterized forme, comme ici:
http://answers.yahoo.com/question/index?qid=20080830195656AA3aEBr
Les premières pages de cette conférence, de faire de même pour l'avion:
http://math.mit.edu/classes/18.02/notes/lecture5compl-09.pdf
Si la normale au plan est perpendiculaire à la direction le long de la ligne, alors vous avez un avantage de cas et la nécessité de voir s'il croise à tous, ou se trouve l'avion.
Sinon, vous avez un point d'intersection, et peut résoudre pour elle.
Je sais que ce n'est pas le code, mais pour obtenir une solution robuste, vous aurez probablement envie de mettre cela dans le contexte de votre application.
EDIT: Voici un exemple pour lequel il y a exactement un point d'intersection. Disons que vous commencez avec les équations paramétrées dans le premier lien:
Le paramètre
t
peut être n'importe quoi. L' (infini) ensemble de tous les(x, y, z)
qui répondent à ces équations composent la ligne. Alors, si vous avez de l'équation d'un plan, de dire:(prises de ici), vous pouvez substituer les équations pour
x
,y
, etz
ci-dessus dans l'équation pour l'avion, qui est maintenant seul le paramètret
. Pour résoudret
. C'est la valeur particulière det
pour que la ligne qui se trouve dans le plan. Ensuite, vous pouvez résoudre pourx
,y
, etz
en remontant jusqu'à la ligne d'équations et de le remplacer part
dans.Utilisation de numpy et python:
Basé sur cette code Matlab (moins les contrôles pour l'intersection), en Python
Résultat
Je l'ai vérifié graphiquement ça semble marcher,
Ce que je crois est plus robuste et la mise en œuvre du lien partagé avant
Si vous avez deux points p et q qui définissent une ligne et un avion dans le grand cartésienne de la forme ax+by+cz+d = 0, vous pouvez utiliser la méthode paramétrique.
Si vous avez besoin de ce aux fins de codage, voici un extrait de code javascript:
JS:
Cette question est vieux, mais étant donné qu'il existe beaucoup plus commode solution que j'ai pensé qu'il pourrait aider quelqu'un.
Avion et les intersections sont très élégant, exprimée en coordonnées homogènes, mais supposons que vous voulez juste la solution:
Il y est un vecteur 4x1 p qui décrit l'avion tel que p^T*x =0 pour tout homogène du point sur le plan. Prochaine calculer la plucker coordonnées de la ligne L=ab^T - ba^T, où a = {point_1; 1}, b={point_2;1}, les deux 4x1 sur la ligne
calculer: x=L*p = {x0,x1,x2,x3}
x_intersect=({x0,x1,x2}/x3) où si x3 est zéro, il n'y a pas d'intersection dans le euclidienne de sens.
Juste pour élargir sur ZGorlock de l' réponse, j'ai fait le produit scalaire, plus et scalse de la 3D Vecteurs. Les références de ces calculs sont Produit Scalaire, Ajouter deux vecteurs 3D et Mise à l'échelle. Remarque: Vec3D est juste une classe personnalisée qui a points: x, y et z.