Quiero calcular el volumen de un objeto de malla 3D que tiene una superficie formada por triángulos.Cómo calcular el volumen de un objeto de malla 3D cuya superficie está formada por triángulos
Respuesta
El GNU Triangulated Surface Librarycan do this for you. Tenga en cuenta que la superficie debe estar cerrada. Ese no será el caso para bastantes modelos 3D.
Si desea implementarlo usted mismo, puede comenzar por echar un vistazo a su código.
Si vuelve a implementar esto, tenga cuidado: la biblioteca GTS es LGPL, por lo que cualquier trabajo derivado debe ser LGPL o GPL. – Cascabel
Si te entiendo correctamente, estás diciendo que ya tienes una malla de triángulos en la superficie y te gustaría generar una malla sólida 3D.
Triángulos significa que tendrá que utilizar elementos tetraédricos para el interior en 3D. Querrá buscar un octree auto meshing algorithm que pueda tomar una malla de superficie como semilla.
Este es un problema común en la literatura de mallado automático de elementos finitos. Yo miraría allí.
Reading this paper, en realidad es un cálculo bastante simple.
El truco consiste en calcular el volumen firmado de un tetraedro - en función de su triángulo y rematado en el origen. El signo del volumen proviene de si su triángulo está apuntando en la dirección del origen. (El normal del triángulo es en sí mismo depende del orden de los vértices, por lo que no se ve que hace referencia explícitamente a continuación.)
Todo esto se reduce a la siguiente función:
public float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3) {
var v321 = p3.X*p2.Y*p1.Z;
var v231 = p2.X*p3.Y*p1.Z;
var v312 = p3.X*p1.Y*p2.Z;
var v132 = p1.X*p3.Y*p2.Z;
var v213 = p2.X*p1.Y*p3.Z;
var v123 = p1.X*p2.Y*p3.Z;
return (1.0f/6.0f)*(-v321 + v231 + v312 - v132 - v213 + v123);
}
y luego un conductor para calcular el volumen de la malla:
public float VolumeOfMesh(Mesh mesh) {
var vols = from t in mesh.Triangles
select SignedVolumeOfTriangle(t.P1, t.P2, t.P3);
return Math.Abs(vols.Sum());
}
Una solución bastante elegante. – levis501
Me pregunto por qué esto no se descubrió antes de 2001. ¿O lo era, pero no tenía relevancia? –
Octubre de 1984, se publicó el documento "Un método simbólico para calcular las propiedades integrales de los poliedros no convexos arbitrarios" y describe este método para calcular el volumen. También es un método más o menos trivial, por lo que necesita mucho más que solo esta información para publicar un documento. –
Yip Frank Kruegers respuesta 1 funciona bien para eso. Si tiene funciones vectoriales disponibles, puede usar esto también:
public static float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3)
{
return p1.Dot(p2.Cross(p3))/6.0f;
}
editar .. added impl. para Dot() y Cross() si no está seguro. La mayoría de las librerías de matemáticas tendrán esto. Si está utilizando WPF, se implementan como métodos estáticos de la clase Vector3D.
public class Vector
{
...
public float Dot(Vector a)
{
return this.X * a.X + this.Y * a.Y + this.Z * a.Z;
}
public Vector Cross(Vector a)
{
return new Vector(
this.Y * a.Z - this.Z * a.Y,
this.Z * a.X - this.X * a.Z,
this.X * a.Y - this.Y * a.X
);
}
...
}
tal vez el código postal para Dot() Y Cruz()? (Ambos son triviales para implementar, pero para completar). Por cierto, la respuesta de @Frank Kruegers es lo que obtienes si simplifica p1.Dot (p2.Cross (p3))/6.0f –
El método anterior es correcta para objetos "simples" (sin intersección/triángulos superpuestos) como esferas tetraedros y así sucesivamente. Para formas más complejas, una buena idea podría ser segmentar la malla (cerrarla) y calcular el volumen de cada segmento por separado. Espero que esto ayude.
si el volumen está firmado no necesitas que el centro esté dentro de – makc
Respuesta incorrecta. El método descrito es el correcto para objetos cerrados arbitrariamente complejos sin triángulos que se intersectan o superponen, y no hay ningún requisito sobre la posición del punto central. Eso es porque los "volúmenes" del tetraedro están firmados y se agregan algebraicamente. – galinette
@galinette Sí, tienes razón. Por objetos "simples" quise decir objetos sin triángulos que se intersectan o superponen. También el centro de la malla puede estar afuera. – imoutidi
- 1. Generando malla cuadrilátera desde la malla de superficie de Mathematica
- 2. WPF Problema de superposición de triángulos 3D
- 3. tetraedrizing una malla
- 4. malla de malla Numpy en 3D
- 5. ¿Por qué se recortan triángulos en esta malla?
- 6. Cómo detectar vértices de borde de un modelo 3D de malla abierta?
- 7. ¿Cómo convierto una malla 2D de triángulos en cuadriláteros?
- 8. Intersecciones de malla a malla
- 9. Algoritmo de contorno 2D para malla 3D proyectada
- 10. simple R 3D interpolación/diagrama de superficie
- 11. Creación de un cubo 3D de malla de alambre
- 12. forma más sencilla de gráficos 3D superficie dada puntos 3d
- 13. Una buena biblioteca 3D de malla
- 14. Algoritmo para simplificar la superficie 3D?
- 15. líneas superpuesta de malla en ContourPlot3D
- 16. Three.js Actualización de malla del objeto TubeGeometry
- 17. ¿Un método para calcular el centro de masa de un archivo .stl (litografía estéreo)?
- 18. Interpolar superficie del cilindro 3D en Matlab
- 19. En Python, ¿cómo hago una malla en 3D?
- 20. Alternativa a ComponentOne Gráfico de mapa de superficie 3D
- 21. Ajuste de superficie polinomial 3D de Python, dependiente del pedido
- 22. colisionando con una malla de loci
- 23. matplotlib: superficie en 3D de una matriz rectangular de alturas
- 24. OpenGL: Problema con bandas triangulares para malla 3d y normales
- 25. 3d Acelerómetro calcular la orientación
- 26. Algoritmo para generar una malla triangular a partir de una nube de puntos
- 27. Matplotlib trazado de datos no uniformes en la superficie 3D
- 28. Encuentra el ángulo normal de la cara de un triángulo en 3D, dadas las coordenadas de sus vértices
- 29. Interpolación de un campo escalar en un espacio 3D
- 30. Generar polígono de sección transversal 2D a partir de malla 3D
No tengo tiempo para darle más información, quizás alguien más cam, pero eche un vistazo: http://amp.ece.cmu.edu/Publication/Cha/icip01_Cha.pdf – nlucaroni
Parece redundante con la pregunta 1410525 – DarenW