diff --git a/GeoModelCore/GeoModelKernel/src/GeoXF.cxx b/GeoModelCore/GeoModelKernel/src/GeoXF.cxx index 6341bcf20d85f6c453dab6f832b1fc642b0f4583..23cac3f8806844d230ec637264e52b1bfcb85f0b 100755 --- a/GeoModelCore/GeoModelKernel/src/GeoXF.cxx +++ b/GeoModelCore/GeoModelKernel/src/GeoXF.cxx @@ -231,25 +231,23 @@ __attribute__ ((flatten)) // // Get the translation part and the rotation part: // - Eigen::Matrix3d linear = m_xf.linear (); - Eigen::EigenSolver<GeoTrf::RotationMatrix3D> solver(linear); - Eigen::MatrixXcd D = solver.eigenvalues().asDiagonal(); - Eigen::MatrixXcd V = solver.eigenvectors(); - + GeoTrf::RotationMatrix3D rotate = m_xf.rotation (); GeoTrf::Vector3D translate = m_xf.translation (); + Eigen::AngleAxis<double> aa(rotate); + // + // Evaluate the function + // double nTimes = (*m_function) (x); // // Modify: // translate *= nTimes; - Eigen::Matrix3cd DPowN=Eigen::Matrix3cd::Zero(); - for (unsigned int i=0;i<3;i++) DPowN(i,i)=pow(D(i,i),nTimes); + double& delta = aa.angle(); + delta *= nTimes; // // Now compose these and return a result: // - GeoTrf::Transform3D tRPowN = GeoTrf::Transform3D::Identity(); - tRPowN.linear()=(V*DPowN*V.inverse()).real(); - return GeoTrf::Translation3D (translate) * tRPowN; + return GeoTrf::Translation3D (translate) * GeoTrf::Transform3D(aa); } GeoTrf::Transform3D Pow::operator () (const GeoGenfun::Argument & argument) const