blob: 10f2f7391d9ad2efead8e701c9f8808e5c636d61 [file] [log] [blame]
//#####################################################################
// Copyright 2003-2004, Ron Fedkiw, Eran Guendelman, Joseph Teran.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class MASS_PROPERTIES_3D
//#####################################################################
//
// Based on Brian Mirtich's volInt.c implementation (copyright 1995) which is based on "Fast and Accurate Computation of Polyhedral Mass Properties" by Mirtich.
//
//#####################################################################
#ifndef __MASS_PROPERTIES_3D__
#define __MASS_PROPERTIES_3D__
#include "../Matrices_And_Vectors/VECTOR_3D.h"
#include "../Matrices_And_Vectors/QUATERNION.h"
#include "../Particles/SOLIDS_PARTICLE.h"
namespace PhysBAM
{
template<class T> class TRIANGULATED_SURFACE;
template<class T> class TRIANGLE_3D;
template<class T> class SYMMETRIC_MATRIX_3X3;
template<class T>
class MASS_PROPERTIES_3D
{
private:
TRIANGULATED_SURFACE<T>& triangulated_surface;
mutable T mass, density;
bool given_mass; // either mass or density is prescribed
int A, B, C; // alpha, beta, gamma (axis permutation)
T P1, Pa, Pb, Paa, Pab, Pbb, Paaa, Paab, Pabb, Pbbb; // projection integrals
T Fa, Fb, Fc, Faa, Fbb, Fcc, Fab, Fbc, Fca, Faaa, Fbbb, Fccc, Faab, Fbbc, Fcca; // face integrals
T volume; // surface area if thin shell
VECTOR_3D<T> T1, T2, TP; // volume integrals
public:
MASS_PROPERTIES_3D (TRIANGULATED_SURFACE<T>& triangulated_surface_input, const bool thin_shell = false)
: triangulated_surface (triangulated_surface_input)
{
if (!triangulated_surface.triangle_list) triangulated_surface.Update_Triangle_List();
Set_Density();
Set_Mass(); // leaves the given_mass=true
if (thin_shell) Compute_Thin_Shell_Integrals();
else Compute_Volume_Integrals();
}
void Set_Mass (T mass_input = 1)
{
mass = mass_input;
given_mass = true;
}
void Set_Density (T density_input = 1)
{
density = density_input;
given_mass = false;
}
T Get_Volume() const
{
return volume;
}
T Get_Surface_Area() const
{
return volume;
}
//#####################################################################
public:
void Get_Center_Of_Mass_And_Inertia_Tensor (VECTOR_3D<T>& center_of_mass, SYMMETRIC_MATRIX_3X3<T>& inertia_tensor) const;
void Transform_To_Object_Frame (VECTOR_3D<T>& center_of_mass, QUATERNION<T>& orientation, DIAGONAL_MATRIX_3X3<T>& moment_of_inertia, SOLIDS_PARTICLE<T, VECTOR_3D<T> >& particles) const;
private:
void Compute_Volume_Integrals();
void Compute_Thin_Shell_Integrals();
void Compute_Face_Integrals (const TRIANGLE_3D<T>& triangle);
void Compute_Projection_Integrals (const TRIANGLE_3D<T>& triangle);
//#####################################################################
};
}
#endif