780{
781 const Matrix3d m0 = trafo.matrix().block<3, 3>(0, 0);
782 mirror = m0.determinant() < 0.0;
783
786 m = m0 * Eigen::DiagonalMatrix<double, 3, 3>(-1.0, 1.0, 1.0);
787 else
788 m = m0;
789 const Eigen::JacobiSVD<Matrix3d> svd(m, Eigen::ComputeFullU | Eigen::ComputeFullV);
792 s = svd.singularValues().asDiagonal();
793
794 scale = !
s.isApprox(Matrix3d::Identity());
797
800 for (int i = 0; i < 3; ++i) {
801 const Vec3d row =
v.row(i).cwiseAbs();
804 if (num_zeros != 2 || num_ones != 1) {
806 break;
807 }
808 }
809
810 const Matrix3d trafo_linear = trafo.linear();
811 const std::array<Vec3d, 3> axes = { Vec3d::UnitX(), Vec3d::UnitY(), Vec3d::UnitZ() };
812 std::array<Vec3d, 3> transformed_axes;
813 for (int i = 0; i < 3; ++i) {
814 transformed_axes[i] = trafo_linear * axes[i];
815 }
816 skew = std::abs(transformed_axes[0].
dot(transformed_axes[1])) >
EPSILON ||
817 std::abs(transformed_axes[1].
dot(transformed_axes[2])) >
EPSILON ||
818 std::abs(transformed_axes[2].
dot(transformed_axes[0])) >
EPSILON;
819
820
821
822 } else
824}
#define EPSILON
Definition ColorUtils.cpp:64
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vec3d
Definition Point.hpp:68
constexpr bool is_approx(Number value, Number test_value, Number precision=EPSILON)
Definition libslic3r.h:320
T dot(const boost::geometry::model::d2::point_xy< T > &v1, const boost::geometry::model::d2::point_xy< T > &v2)
Definition ExtrusionSimulator.cpp:154
Eigen::Matrix< double, 3, 3, Eigen::DontAlign > Matrix3d
Definition Point.hpp:86