本文整理汇总了C++中Vector3s::asDiagonal方法的典型用法代码示例。如果您正苦于以下问题:C++ Vector3s::asDiagonal方法的具体用法?C++ Vector3s::asDiagonal怎么用?C++ Vector3s::asDiagonal使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Vector3s
的用法示例。
在下文中一共展示了Vector3s::asDiagonal方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: computeMoments
//.........这里部分代码省略.........
const Vector3s N{ ( v1 - v0 ).cross( v2 - v0 ) };
// Compute the integral terms
scalar tmp0{ v0.x() + v1.x() };
scalar tmp1{ v0.x() * v0.x() };
scalar tmp2{ tmp1 + v1.x() * tmp0 };
const scalar f1x{ tmp0 + v2.x() };
const scalar f2x{ tmp2 + v2.x() * f1x };
const scalar f3x{ v0.x() * tmp1 + v1.x() * tmp2 + v2.x() * f2x };
const scalar g0x{ f2x + v0.x() * ( f1x + v0.x() ) };
const scalar g1x{ f2x + v1.x() * ( f1x + v1.x() ) };
const scalar g2x{ f2x + v2.x() * ( f1x + v2.x() ) };
tmp0 = v0.y() + v1.y();
tmp1 = v0.y() * v0.y();
tmp2 = tmp1 + v1.y() * tmp0;
const scalar f1y{ tmp0 + v2.y() };
const scalar f2y{ tmp2 + v2.y() * f1y };
const scalar f3y{ v0.y() * tmp1 + v1.y() * tmp2 + v2.y() * f2y };
const scalar g0y{ f2y + v0.y() * ( f1y + v0.y() ) };
const scalar g1y{ f2y + v1.y() * ( f1y + v1.y() ) };
const scalar g2y{ f2y + v2.y() * ( f1y + v2.y() ) };
tmp0 = v0.z() + v1.z();
tmp1 = v0.z()*v0.z();
tmp2 = tmp1 + v1.z()*tmp0;
const scalar f1z{ tmp0 + v2.z() };
const scalar f2z{ tmp2 + v2.z() * f1z };
const scalar f3z{ v0.z() * tmp1 + v1.z() * tmp2 + v2.z() * f2z };
const scalar g0z{ f2z + v0.z() * ( f1z + v0.z() ) };
const scalar g1z{ f2z + v1.z() * ( f1z + v1.z() ) };
const scalar g2z{ f2z + v2.z() * ( f1z + v2.z() ) };
// Update integrals
integral(0) += N.x() * f1x;
integral(1) += N.x() * f2x;
integral(2) += N.y() * f2y;
integral(3) += N.z() * f2z;
integral(4) += N.x() * f3x;
integral(5) += N.y() * f3y;
integral(6) += N.z() * f3z;
integral(7) += N.x() * ( v0.y() * g0x + v1.y() * g1x + v2.y() * g2x );
integral(8) += N.y() * ( v0.z() * g0y + v1.z() * g1y + v2.z() * g2y );
integral(9) += N.z() * ( v0.x() * g0z + v1.x() * g1z + v2.x() * g2z );
}
integral(0) *= oneDiv6;
integral(1) *= oneDiv24;
integral(2) *= oneDiv24;
integral(3) *= oneDiv24;
integral(4) *= oneDiv60;
integral(5) *= oneDiv60;
integral(6) *= oneDiv60;
integral(7) *= oneDiv120;
integral(8) *= oneDiv120;
integral(9) *= oneDiv120;
// Mass
mass = integral(0);
// Center of mass
center = Vector3s( integral(1), integral(2), integral(3) )/mass;
// Inertia relative to world origin
R(0,0) = integral(5) + integral(6);
R(0,1) = -integral(7);
R(0,2) = -integral(9);
R(1,0) = R(0,1);
R(1,1) = integral(4) + integral(6);
R(1,2) = -integral(8);
R(2,0) = R(0,2);
R(2,1) = R(1,2);
R(2,2) = integral(4) + integral(5);
// Comptue the inertia relative to the center of mass
R(0,0) -= mass * ( center.y() * center.y() + center.z() * center.z() );
R(0,1) += mass * center.x() * center.y();
R(0,2) += mass * center.z() * center.x();
R(1,0) = R(0,1);
R(1,1) -= mass * ( center.z() * center.z() + center.x() * center.x() );
R(1,2) += mass * center.y() * center.z();
R(2,0) = R(0,2);
R(2,1) = R(1,2);
R(2,2) -= mass * ( center.x() * center.x() + center.y() * center.y() );
// Diagonalize the inertia tensor
Matrix3s R0;
diagonalizeInertiaTensor( R, R0, I );
// Check that we actually diagonalized the inertia tensor
assert( ( R0 * Matrix3s( I.asDiagonal() ) * R0.transpose() - R ).lpNorm<Eigen::Infinity>() <= 1.0e-6 );
assert( ( Matrix3s( I.asDiagonal() ) - R0.transpose() * R * R0 ).lpNorm<Eigen::Infinity>() <= 1.0e-6 );
R = R0;
// All inertias should be positive
assert( ( I.array() > 0.0 ).all() );
// Check that we have an orthonormal transformation
assert( ( R * R.transpose() - Matrix3s::Identity() ).lpNorm<Eigen::Infinity>() <= 1.0e-6 );
assert( fabs( R.determinant() - 1.0 ) <= 1.0e-6 );
}