Déterminer si un point 3D est à l'intérieur d'un triangle
Donné un point 3D (x, y, & z), et un triangle formé de trois autres points 3D, comment puis-je déterminer si le point est dans le triangle?
J'ai beaucoup lu à ce sujet dans la 2D, la plus utile étant http://imusthaveit.spaces.live.com/blog/cns!B5212D3C9F7D8093!410.entrée, mais j'ai du mal à déplacer le concept de 3D - pourrait aider quelqu'un avec le concept général ou un exemple de code?
En fin de compte ce que je suis désireux de faire est d'obtenir une liste de points que peut représenter l'intérieur du triangle.
Pouvez-vous donner un peu plus de détails sur pourquoi vous voulez la liste des points d' - après tout, c'est théoriquement infini liste
J'ai une facettes de la représentation d'un solide 3D, ce que j'essaie de faire est de représenter chaque facette à l'intérieur d'une grille 3D de la structure (une base de voxel de la représentation). Pour ce faire, j'ai besoin d'être en mesure de représenter les facettes (triangles) comme un ensemble de points de données (pour ma donné une représentation...)
Pourriez-vous élaborer? Vous voulez voir si un point est sur un plan triangulaire ou si le point est contenue à l'intérieur d'une pyramide. - Il Correct?
J'ai une facettes de la représentation d'un solide 3D, ce que j'essaie de faire est de représenter chaque facette à l'intérieur d'une grille 3D de la structure (une base de voxel de la représentation). Pour ce faire, j'ai besoin d'être en mesure de représenter les facettes (triangles) comme un ensemble de points de données (pour ma donné une représentation...)
Pourriez-vous élaborer? Vous voulez voir si un point est sur un plan triangulaire ou si le point est contenue à l'intérieur d'une pyramide. - Il Correct?
OriginalL'auteur | 2009-06-15
Vous devez vous connecter pour publier un commentaire.
Êtes-vous vraiment parler de 3 points d'un triangle ou 4 points d'une pyramide?
Un seul point est extrêmement peu probable que jamais exactement être sur le plan d'un plat triangle dans un espace 3d.
EDIT:
Comme une idée pour le triangle de version (comme il semble que vous voulez). Vous pourriez effectuer 3x2D contrôles. Jeter le Z cooridinates à partir de votre point de contrôle et les trois triangle points, puis voir si le point est dans l'avion à l'aide de votre méthode existante. Puis faire de même ignorant simplement les coordonnées X et puis, de nouveau, ignorant simplement la coordonnée Y de la. Je suis sûr que c'est pas la méthode la plus efficace, mais il sera simple de code.
Édité avec une idée, mais ne sera pas efficace.
Les projets 2D idée ne fonctionne pas. Dans Blender, j'ai pu facilement faire un triangle et un point (une minuscule sphère) où le point apparaît dans le traingle dans les trois x, y, z projections, mais dans un point de vue général, n'est clairement pas dans le plan du triangle.
Je voulais dire "projections", pas de "projets", duh.
OriginalL'auteur Robin Day
Étant donné un point P et un triangle A, B, C, calculer:
(dans l'ordre!)
Pense maintenant le produit scalaire N1*N2. si P est dans le plan du triangle, et à l'intérieur de trois côtés, ceux normales doivent être parallèles, de sorte que ce produit scalaire sera 1.0000 (ou 0.999...). Si P est conservé dans l'avion, mais a déménagé au-delà du côté BC, ces deux normales sera opposé: N1*N2==-1. Si P n'est pas dans l'avion, le produit scalaire sera une certaine valeur intermédiaire. Oups, nous avons encore une échappatoire - si P va passé à côté de CA. Nous avons besoin de calculer un plus:
Faire de ces deux tests (dans un monde idéal):
(test N3*N1 est redondant) bien sûr, le test devra permettre à certains de décantation pour les imperfections de l'arithmétique des ordinateurs. Chercher (N1*N2 > 1-epsilon) où epsilon est une petite utilité, en fonction de la précision requise et de types à virgule flottante.
Vous pouvez avoir besoin d'une formule pour ces unités normales. Compte tenu de (A,B,C) calculer le produit vectoriel N =(B-A)x(C-B). Puis diviser par sqrt(N*N). Définitions de "produit scalaire" et "produit vectoriel" sont faciles à trouver dans les manuels scolaires et wikipedia etc. Il est possible d'augmenter les performances avec une certaine algèbre à propos des racines carrées.
Je ne prétend pas que c'est l'algorithme le plus rapide, mais devrait fonctionner (jusqu'à
OriginalL'auteur DarenW
OriginalL'auteur omid
La méthode décrite ici est très bon pour le 2D cas. Je pense qu'il est possible de le modifier pour le travail en 3D. Cela ne veut pas répondre directement à votre question, mais si vous comprenez cette méthode, vous devriez être en mesure de travailler sur la façon de la modifier pour la 3D (si c'est possible).
La grande référence de! M'aide beaucoup.
OriginalL'auteur David Johnstone
Bon point. Que serait le point 3. Cependant, je voudrais suggérer que la première scène que j'ai décrite permettrait d'éliminer un grand nombre de cas.
OriginalL'auteur PaulJWilliams
Donné un point 3D P et les trois sommets d'un triangle T1, T2, T3
Maintenant, vous pouvez transformer tous les points de la 2D problème de trouver un point dans le triangle.
Aussi la distance de P à l'avion va vous dire comment fermer le point d'être exactement sur le triangle.
Si je comprends vos élaboration correctement vous êtes planification pour examiner tous les voxels dans votre grille 3D pour savoir si ils sont dans un triangle? Ce serait très inefficace - je pense qu'une version 3D de Bresenham ligne de l'algorithme peut travailler pour ce que vous voulez faire. Il serait trivial de trouver le voxel que T1 est en, puis progresser à travers les voxels vers T2, en répétant pour la T3 et de retour à T1.
OriginalL'auteur danio
Juste de mes observations d'amélioration sur ce (vieux) post.
Si vous (pré) calculer le U&V des vecteurs pour le triangle (U étant le vecteur de A à B et V le vecteur de A à C en standard triangle A-B-C, à la fois U et V sont pas nécessairement unité de longueur) alors le vecteur P (de A au Point) peut être utilisé de la manière suivante: calculer produit scalaire de P avec U et P avec V. Si les deux point des produits sont moins (ou l'égalité de point sur le bord) à une mais plus grande (ou égal) à zéro, et leur somme est inférieure (ou égale) à un , puis le point est à l'intérieur, sinon il est à l'extérieur. Cette approche est plus efficace que d'abord comparer les normales (de la croix-produits) et puis aussi leur point des produits.
Cette approche ne nécessite pas que les points sont en fait déjà dans l'ordre de former un droitier triangle et en tant que tel, plus stable. Ce qu'elle exige, c'est que le point se trouve dans le plan (ou presque) pour environ précis.
OriginalL'auteur Solveering