volúmenes volumenes volumen una transversales transversal tiene sólidos solido secciones seccion por perpendicular más metodo medio los ejemplos cuadrada conocidos concepto calculo math geometry volume

math - volumenes - Cómo calcular el volumen de un objeto de malla 3D cuya superficie está formada por triángulos



volumenes por medio de secciones transversales (5)

El método anterior es correcto para objetos "simples" (sin triángulos que se intersectan o superponen) como esferas, tetraedros, etc. 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.

Quiero calcular el volumen de un objeto de malla 3D que tiene una superficie formada por triángulos.



La respuesta de Yip Frank Kruegers funciona bien +1 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 ... agregado 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 ); } ... }


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 a partir de ella.

Triángulos significa que tendrás que usar elementos tetraédricos para el interior 3D. Querrá buscar un algoritmo de mallado automático de octree 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í.


Al leer este documento , en realidad es un cálculo bastante simple.

El truco es calcular el volumen firmado de un tetraedro, basado en su triángulo y coronado en el origen. El signo del volumen proviene de si su triángulo está apuntando en la dirección del origen. (La normalidad del triángulo depende del orden de los vértices, por lo que no se ve explícitamente a continuación).

Todo esto se reduce a la siguiente función simple:

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 controlador 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()); }