40 const MatrixXd &all_uv_positions_in_initialization,
41 const VectorXi &indices_of_pinned_vertices,
42 MatrixXd &position_of_pinned_vertices_in_initialization)
45 for (VectorXi::InnerIterator it(indices_of_pinned_vertices, 0); it; ++it, i++) {
46 int vertex_index = it.value();
47 position_of_pinned_vertices_in_initialization.row(i) = all_uv_positions_in_initialization.row(
95 MatrixXd centered_initialized_pins,
96 Matrix2d &transformation_matrix)
98 int number_of_pinned_vertices = centered_pins.rows();
100 MatrixXd a = MatrixXd::Zero(number_of_pinned_vertices * 2, 1);
101 a << centered_initialized_pins.col(0), centered_initialized_pins.col(1);
103 VectorXd p(2 * number_of_pinned_vertices);
104 p << centered_pins.col(0), centered_pins.col(1);
106 VectorXd t = a.colPivHouseholderQr().solve(p);
108 transformation_matrix << t(0), 0, 0, t(0);
112 Vector2d &translation_vector,
113 Matrix2d &transformation_matrix,
114 bool is_flip_allowed)
118 MatrixXd position_of_initialized_pins(slim_data.
b.rows(), 2);
120 slim_data.
V_o, slim_data.
b, position_of_initialized_pins);
122 Vector2d centroid_of_initialized;
125 Vector2d centroid_of_pins;
128 MatrixXd centered_initialized_pins = position_of_initialized_pins.rowwise().operator-(
129 centroid_of_initialized.transpose());
130 MatrixXd centeredpins = slim_data.
bc.rowwise().operator-(centroid_of_pins.transpose());
132 MatrixXd s = centered_initialized_pins.transpose() * centeredpins;
134 JacobiSVD<MatrixXd> svd(s, ComputeFullU | ComputeFullV);
136 Matrix2d vu_t = svd.matrixV() * svd.matrixU().transpose();
138 Matrix2d singular_values = Matrix2d::Identity();
140 bool contains_reflection = vu_t.determinant() < 0;
141 if (contains_reflection) {
142 if (!is_flip_allowed) {
143 singular_values(1, 1) = vu_t.determinant();
152 transformation_matrix = transformation_matrix * svd.matrixV() * singular_values *
153 svd.matrixU().transpose();
155 translation_vector = centroid_of_pins - transformation_matrix * centroid_of_initialized;
159 Matrix2d &transformation_matrix)
163 Vector2d pinned_position_difference_vector = slim_data.
bc.row(0) - slim_data.
bc.row(1);
164 Vector2d initialized_position_difference_vector = slim_data.
V_o.row(slim_data.
b(0)) -
165 slim_data.
V_o.row(slim_data.
b(1));
167 double scale = pinned_position_difference_vector.norm() /
168 initialized_position_difference_vector.norm();
170 pinned_position_difference_vector.normalize();
171 initialized_position_difference_vector.normalize();
174 double cos_angle = pinned_position_difference_vector.dot(initialized_position_difference_vector);
175 double sin_angle =
sqrt(1 -
pow(cos_angle, 2));
177 transformation_matrix << cos_angle, -sin_angle, sin_angle, cos_angle;
178 transformation_matrix = (Matrix2d::Identity() * scale) * transformation_matrix;
190 Matrix2d transformation_matrix;
191 Vector2d translation_vector;
193 int number_of_pinned_vertices = slim_data.
b.rows();
195 switch (number_of_pinned_vertices) {
213 slim_data, translation_vector, transformation_matrix, flip_allowed);