57 using VertexType = MeshType::VertexType;
58 using FaceType = MeshType::FaceType;
59 using ScalarType = VertexType::CoordType::ScalarType;
61 enum { X = 0, Y = 1, Z = 2 };
68 double mP1, mPa, mPb, mPaa, mPab, mPbb, mPaaa, mPaab, mPabb, mPbbb;
71 double mFa, mFb, mFc, mFaa, mFbb, mFcc;
72 double mFaaa, mFbbb, mFccc, mFaab, mFbbc, mFcca;
75 double mT0 = 0, mT1[3] = {0, 0, 0}, mT2[3] = {0, 0, 0}, mTP[3] = {0, 0, 0};
82 for (
const FaceType& f :
m.faces()) {
83 if (
faceArea(f) > std::numeric_limits<float>::min()) {
90 if (nx > ny && nx > nz)
93 mC = (ny > nz) ? Y : Z;
99 mT0 +=
fn[X] * ((mA == X) ? mFa : ((mB == X) ? mFb : mFc));
101 mT1[mA] +=
fn[mA] * mFaa;
102 mT1[mB] +=
fn[mB] * mFbb;
103 mT1[mC] +=
fn[mC] * mFcc;
104 mT2[mA] +=
fn[mA] * mFaaa;
105 mT2[mB] +=
fn[mB] * mFbbb;
106 mT2[mC] +=
fn[mC] * mFccc;
107 mTP[mA] +=
fn[mA] * mFaab;
108 mTP[mB] +=
fn[mB] * mFbbc;
109 mTP[mC] +=
fn[mC] * mFcca;
129 ScalarType
volume()
const {
return mT0; }
140 template<
typename Matrix33>
141 Matrix33 inertiaTensor()
const
149 J(X, X) = (mT2[Y] + mT2[Z]);
150 J(Y, Y) = (mT2[Z] + mT2[X]);
151 J(Z, Z) = (mT2[X] + mT2[Y]);
152 J(X, Y) = J(Y, X) = -mTP[X];
153 J(Y, Z) = J(Z, Y) = -mTP[Y];
154 J(Z, X) = J(X, Z) = -mTP[Z];
156 J(X, X) -= mT0 * (r[Y] * r[Y] + r[Z] * r[Z]);
157 J(Y, Y) -= mT0 * (r[Z] * r[Z] + r[X] * r[X]);
158 J(Z, Z) -= mT0 * (r[X] * r[X] + r[Y] * r[Y]);
159 J(X, Y) = J(Y, X) += mT0 * r[X] * r[Y];
160 J(Y, Z) = J(Z, Y) += mT0 * r[Y] * r[Z];
161 J(Z, X) = J(X, Z) += mT0 * r[Z] * r[X];
173 template<
typename Matrix33>
179 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d>
eig(
it);
180 Eigen::Vector3d
c_val =
eig.eigenvalues();
182 Eigen::Matrix3d
c_vec =
eig.eigenvectors();
183 c_vec.transposeInPlace();
191 static ScalarType sqr(
const ScalarType& x) {
return x * x; }
193 static ScalarType cube(
const ScalarType& x) {
return x * x * x; }
195 void faceIntegrals(
const FaceType& f,
const Point3<ScalarType>& n)
198 double k1, k2, k3, k4;
202 w = -f.vertex(0)->coord().dot(n);
210 mFc = -k2 * (n[mA] * mPa + n[mB] * mPb + w * mP1);
214 mFcc = k3 * (sqr(n[mA]) * mPaa + 2 * n[mA] * n[mB] * mPab +
216 w * (2 * (n[mA] * mPa + n[mB] * mPb) + w * mP1));
220 mFccc = -k4 * (cube(n[mA]) * mPaaa + 3 * sqr(n[mA]) * n[mB] * mPaab +
221 3 * n[mA] * sqr(n[mB]) * mPabb + cube(n[mB]) * mPbbb +
223 (sqr(n[mA]) * mPaa + 2 * n[mA] * n[mB] * mPab +
225 w * w * (3 * (n[mA] * mPa + n[mB] * mPb) + w * mP1));
228 mFbbc = -k2 * (n[mA] * mPabb + n[mB] * mPbbb + w * mPbb);
229 mFcca = k3 * (sqr(n[mA]) * mPaaa + 2 * n[mA] * n[mB] * mPaab +
231 w * (2 * (n[mA] * mPaa + n[mB] * mPab) + w * mPa));
247 mP1 = mPa = mPb = mPaa = mPab = mPbb = mPaaa = mPaab = mPabb = mPbbb =
250 for (
uint i = 0;
i < f.vertexNumber();
i++) {
251 a0 = f.vertex(
i)->coord()[mA];
252 b0 = f.vertex(
i)->coord()[mB];
253 a1 = f.vertexMod(
i + 1)->coord()[mA];
254 b1 = f.vertexMod(
i + 1)->coord()[mB];
auto faceArea(const FaceType &f)
Computes the area of a face. Works both for triangle and polygonal faces, and it is optimized in case...
Definition geometry.h:101