¿Cómo comprobar si el punto está en el tetraedro o no?

Conozco todas las coordenadas del tetraedro y el punto que me gustaría determinar. Entonces, ¿alguien sabe cómo hacerlo? He intentado determinar la pertenencia del punto a cada triángulo del tetraedro, y si es verdadero para todos los triangularjs, el punto está en el tetraedro. Pero es absolutamente incorrecto.

Se define un tetraedro por cuatro vértices. ABC y D Por lo tanto, también puedes tener los 4 triangularjs que definen la superficie del tetraedro.

Usted sabe, simplemente, si un punto P está en el otro lado del plano. Lo normal de cada plano es apuntar hacia el centro del tetraedro. Así que solo hay que probar contra 4 aviones.

Su ecuación de plano se ve así: a*x+b*y+c*z+d=0 Simplemente complete los valores de los puntos (xyz). Si el signo del resultado es> 0, el punto es del mismo lado que el normal, resultado == 0, el punto se encuentra en el plano y, en su caso, desea la tercera opción. <0 significa que está en la parte trasera del avión. Si esto se cumple para los 4 planos, su punto se encuentra dentro del tetraedro

Para cada plano del tetraedro, verifique si el punto está en el mismo lado que el vértice restante:

 bool SameSide(v1, v2, v3, v4, p) { normal := cross(v2 - v1, v3 - v1) dotV4 := dot(normal, v4 - v1) dotP := dot(normal, p - v1) return Math.Sign(dotV4) == Math.Sign(dotP); } 

Y necesitas comprobar esto para cada avión:

 bool PointInTetrahedron(v1, v2, v3, v4, p) { return SameSide(v1, v2, v3, v4, p) && SameSide(v2, v3, v4, v1, p) && SameSide(v3, v4, v1, v2, p) && SameSide(v4, v1, v2, v3, p); } 

Dados 4 puntos A, B, C, D que definen un tetraedro no degenerado y un punto P para probar, una forma sería transformar las coordenadas de P en el sistema de coordenadas del tetraedro, por ejemplo, tomando A como origen, y Vectores BA, CA, DA como los vectores unitarios.

En este sistema de coordenadas, las coordenadas de P están todas entre 0 y 1 si está dentro de P, pero también podría estar en cualquier lugar del cubo transformado definido por el origen y los vectores de 3 unidades. Una forma de afirmar que P está dentro (A, B, C, D) es tomando a su vez como origen los puntos (A, B, C y D) y los otros tres puntos para definir un nuevo sistema de coordenadas. Esta prueba repetida 4 veces es efectiva pero puede mejorarse.

Es más eficiente transformar las coordenadas solo una vez y reutilizar la función SameSide como se propuso anteriormente, por ejemplo, tomando A como origen, transformándose en el sistema de coordenadas (A, B, C, D), P y A deben estar en el mismo lado del plano (B, C, D).

A continuación se muestra una implementación numpy / python de esa prueba. Las pruebas indican que este método es 2-3 veces más rápido que el método Planos.

 import numpy as np def sameside(v1,v2,v3,v4,p): normal = np.cross(v2-v1, v3-v1) return ((np.dot(normal, v4-v1)*p.dot(normal, p-v1) > 0) def tetraCoord(A,B,C,D): v1 = BA ; v2 = CA ; v3 = DA # mat defines an affine transform from the tetrahedron to the orthogonal system mat = np.concatenate((np.array((v1,v2,v3,A)).T, np.array([[0,0,0,1]]))) # The inverse matrix does the opposite (from orthogonal to tetrahedron) M1 = np.linalg.inv(mat) return(M1) def pointInsideT(v1,v2,v3,v4,p): # Find the transform matrix from orthogonal to tetrahedron system M1=tetraCoord(v1,v2,v3,v4) # apply the transform to P p1 = np.append(p,1) newp = M1.dot(p1) # perform test return(np.all(newp>=0) and np.all(newp <=1) and sameside(v2,v3,v4,v1,p))