55 inPlaceCompute(parameters, transformedCloud);
56 return transformedCloud;
65 assert(cloud.
features.rows() == parameters.rows());
66 assert(parameters.rows() == parameters.cols());
68 if(this->checkParameters(parameters) ==
false)
69 throw TransformationError(
"RigidTransformation: Error, rotation matrix is not orthogonal.");
72 cloud.
features.applyOnTheLeft(parameters);
75 const unsigned int nbRows = parameters.rows()-1;
76 const unsigned int nbCols = parameters.cols()-1;
79 int descStartingRow(0);
87 if (descName ==
"normals" || descName ==
"observationDirections" || descName ==
"orientationX" || descName ==
"orientationY" || descName ==
"orientationZ")
89 cloud.
descriptors.block(descStartingRow, 0, descSpan, descCols).applyOnTheLeft(R);
91 else if (descName ==
"eigVectors")
93 int vectorSpan = std::sqrt(descSpan);
94 int vectorStartingRow = descStartingRow;
96 cloud.
descriptors.block(vectorStartingRow, 0, vectorSpan, descCols).applyOnTheLeft(R);
97 vectorStartingRow += vectorSpan;
98 cloud.
descriptors.block(vectorStartingRow, 0, vectorSpan, descCols).applyOnTheLeft(R);
102 vectorStartingRow += vectorSpan;
103 cloud.
descriptors.block(vectorStartingRow, 0, vectorSpan, descCols).applyOnTheLeft(R);
107 descStartingRow += descSpan;
116 const T epsilon = 0.001;
117 const unsigned int nbRows = parameters.rows()-1;
118 const unsigned int nbCols = parameters.cols()-1;
122 if(
anyabs(1 - R.determinant()) > epsilon)
134 if(ortho.cols() == 4)
137 const Eigen::Matrix<T, 3, 1> col1 = parameters.block(0, 1, 3, 1).normalized();
138 const Eigen::Matrix<T, 3, 1> col2 = parameters.block(0, 2, 3, 1).normalized();
140 const Eigen::Matrix<T, 3, 1> newCol0 = col1.cross(col2);
141 const Eigen::Matrix<T, 3, 1> newCol1 = col2.cross(newCol0);
142 const Eigen::Matrix<T, 3, 1> newCol2 = col2;
144 ortho.block(0, 0, 3, 1) = newCol0;
145 ortho.block(0, 1, 3, 1) = newCol1;
146 ortho.block(0, 2, 3, 1) = newCol2;
148 else if(ortho.cols() == 3)
150 const T epsilon = 0.001;
154 if(
anyabs(parameters(0,0) - parameters(1,1)) > epsilon ||
anyabs(parameters(1,0) + parameters(0,1)) > epsilon)
156 throw TransformationError(
"RigidTransformation: Error, only proper rigid transformations are supported.");
160 T a = (parameters(0,0) + parameters(1,1))/2;
161 T b = (-parameters(1,0) + parameters(0,1))/2;
162 T sum = sqrt(
pow(a,2) +
pow(b,2));
167 ortho(0,0) = a; ortho(0,1) = b;
168 ortho(1,0) = -b; ortho(1,1) = a;
185 inPlaceCompute(parameters, transformedCloud);
186 return transformedCloud;
195 assert(cloud.
features.rows() == parameters.rows());
196 assert(parameters.rows() == parameters.cols());
198 if(this->checkParameters(parameters) ==
false)
199 throw TransformationError(
"SimilarityTransformation: Error, invalid similarity transform.");
202 cloud.
features.applyOnTheLeft(parameters);
205 const unsigned int nbRows = parameters.rows() - 1;
206 const unsigned int nbCols = parameters.cols() - 1;
209 int descStartingRow(0);
217 if (descName ==
"normals" || descName ==
"observationDirections" || descName ==
"orientationX" || descName ==
"orientationY" || descName ==
"orientationZ")
219 cloud.
descriptors.block(descStartingRow, 0, descSpan, descCols).applyOnTheLeft(R);
221 else if (descName ==
"eigVectors")
223 int vectorSpan = std::sqrt(descSpan);
224 int vectorStartingRow = descStartingRow;
226 cloud.
descriptors.block(vectorStartingRow, 0, vectorSpan, descCols).applyOnTheLeft(R);
227 vectorStartingRow += vectorSpan;
228 cloud.
descriptors.block(vectorStartingRow, 0, vectorSpan, descCols).applyOnTheLeft(R);
232 vectorStartingRow += vectorSpan;
233 cloud.
descriptors.block(vectorStartingRow, 0, vectorSpan, descCols).applyOnTheLeft(R);
237 descStartingRow += descSpan;
263 inPlaceCompute(parameters, transformedCloud);
264 return transformedCloud;
271 assert(cloud.
features.rows() == parameters.rows());
272 assert(parameters.rows() == parameters.cols());
274 if(this->checkParameters(parameters) ==
false)
278 cloud.
features.applyOnTheLeft(parameters);
284 const int rows = parameters.rows();
285 const int cols = parameters.cols();
291 correctedParameters.block(0,0,rows-1,cols-1).setIdentity();
294 correctedParameters.block(rows-1,0,1,cols-1).setZero();
295 correctedParameters(rows-1,cols-1) = 1;
297 return correctedParameters;
303 const int rows = parameters.rows();
304 const int cols = parameters.cols();
310 parameters_.block(0,cols-1,rows-1,1).setZero();
313 if (parameters_.isApprox(TransformationParameters::Identity(rows,cols)))