|
@@ -17,114 +17,114 @@
|
|
|
#include <sstream>
|
|
#include <sstream>
|
|
|
#include <igl/writeDMAT.h>
|
|
#include <igl/writeDMAT.h>
|
|
|
|
|
|
|
|
-// TEST_CASE("miq: 3_holes", "[igl/copyleft/comiso]")
|
|
|
|
|
-// {
|
|
|
|
|
-// using namespace Eigen;
|
|
|
|
|
-
|
|
|
|
|
-// // Input mesh
|
|
|
|
|
-// Eigen::MatrixXd V;
|
|
|
|
|
-// Eigen::MatrixXi F;
|
|
|
|
|
|
|
+TEST_CASE("miq: 3_holes", "[igl/copyleft/comiso]")
|
|
|
|
|
+{
|
|
|
|
|
+using namespace Eigen;
|
|
|
|
|
+
|
|
|
|
|
+// Input mesh
|
|
|
|
|
+Eigen::MatrixXd V;
|
|
|
|
|
+Eigen::MatrixXi F;
|
|
|
|
|
|
|
|
-// // Face barycenters
|
|
|
|
|
-// Eigen::MatrixXd B;
|
|
|
|
|
|
|
+// Face barycenters
|
|
|
|
|
+Eigen::MatrixXd B;
|
|
|
|
|
|
|
|
-// // Cross field
|
|
|
|
|
-// Eigen::MatrixXd X1,X2;
|
|
|
|
|
|
|
+// Cross field
|
|
|
|
|
+Eigen::MatrixXd X1,X2;
|
|
|
|
|
|
|
|
-// // Bisector field
|
|
|
|
|
-// Eigen::MatrixXd BIS1, BIS2;
|
|
|
|
|
|
|
+// Bisector field
|
|
|
|
|
+Eigen::MatrixXd BIS1, BIS2;
|
|
|
|
|
|
|
|
-// // Combed bisector
|
|
|
|
|
-// Eigen::MatrixXd BIS1_combed, BIS2_combed;
|
|
|
|
|
|
|
+// Combed bisector
|
|
|
|
|
+Eigen::MatrixXd BIS1_combed, BIS2_combed;
|
|
|
|
|
|
|
|
-// // Per-corner, integer mismatches
|
|
|
|
|
-// Eigen::Matrix<int, Eigen::Dynamic, 3> MMatch;
|
|
|
|
|
|
|
+// Per-corner, integer mismatches
|
|
|
|
|
+Eigen::Matrix<int, Eigen::Dynamic, 3> MMatch;
|
|
|
|
|
|
|
|
-// // Field singularities
|
|
|
|
|
-// Eigen::Matrix<int, Eigen::Dynamic, 1> isSingularity, singularityIndex;
|
|
|
|
|
|
|
+// Field singularities
|
|
|
|
|
+Eigen::Matrix<int, Eigen::Dynamic, 1> isSingularity, singularityIndex;
|
|
|
|
|
|
|
|
-// // Per corner seams
|
|
|
|
|
-// Eigen::Matrix<int, Eigen::Dynamic, 3> Seams;
|
|
|
|
|
|
|
+// Per corner seams
|
|
|
|
|
+Eigen::Matrix<int, Eigen::Dynamic, 3> Seams;
|
|
|
|
|
|
|
|
-// // Combed field
|
|
|
|
|
-// Eigen::MatrixXd X1_combed, X2_combed;
|
|
|
|
|
|
|
+// Combed field
|
|
|
|
|
+Eigen::MatrixXd X1_combed, X2_combed;
|
|
|
|
|
|
|
|
-// // Global parametrization
|
|
|
|
|
-// Eigen::MatrixXd UV;
|
|
|
|
|
-// Eigen::MatrixXi FUV;
|
|
|
|
|
|
|
+// Global parametrization
|
|
|
|
|
+Eigen::MatrixXd UV;
|
|
|
|
|
+Eigen::MatrixXi FUV;
|
|
|
|
|
|
|
|
-// // Global parametrization (reference)
|
|
|
|
|
-// Eigen::MatrixXd UV_ref;
|
|
|
|
|
-// Eigen::MatrixXi FUV_ref;
|
|
|
|
|
|
|
+// Global parametrization (reference)
|
|
|
|
|
+Eigen::MatrixXd UV_ref;
|
|
|
|
|
+Eigen::MatrixXi FUV_ref;
|
|
|
|
|
|
|
|
-// // Load a mesh in OFF format
|
|
|
|
|
-// igl::readOFF(test_common::data_path("3holes.off"), V, F);
|
|
|
|
|
|
|
+// Load a mesh in OFF format
|
|
|
|
|
+igl::readOFF(test_common::data_path("3holes.off"), V, F);
|
|
|
|
|
|
|
|
-// double gradient_size = 50;
|
|
|
|
|
-// double iter = 0;
|
|
|
|
|
-// double stiffness = 5.0;
|
|
|
|
|
-// bool direct_round = 0;
|
|
|
|
|
|
|
+double gradient_size = 50;
|
|
|
|
|
+double iter = 0;
|
|
|
|
|
+double stiffness = 5.0;
|
|
|
|
|
+bool direct_round = 0;
|
|
|
|
|
|
|
|
-// // Compute face barycenters
|
|
|
|
|
-// igl::barycenter(V, F, B);
|
|
|
|
|
|
|
+// Compute face barycenters
|
|
|
|
|
+igl::barycenter(V, F, B);
|
|
|
|
|
|
|
|
-// // Contrain one face
|
|
|
|
|
-// VectorXi b(1);
|
|
|
|
|
-// b << 0;
|
|
|
|
|
-// MatrixXd bc(1, 3);
|
|
|
|
|
-// bc << 1, 0, 0;
|
|
|
|
|
|
|
+// Contrain one face
|
|
|
|
|
+VectorXi b(1);
|
|
|
|
|
+b << 0;
|
|
|
|
|
+MatrixXd bc(1, 3);
|
|
|
|
|
+bc << 1, 0, 0;
|
|
|
|
|
|
|
|
-// // Create a smooth 4-RoSy field
|
|
|
|
|
-// VectorXd S;
|
|
|
|
|
-// igl::copyleft::comiso::nrosy(V, F, b, bc, VectorXi(), VectorXd(), MatrixXd(), 4, 0.5, X1, S);
|
|
|
|
|
|
|
+// Create a smooth 4-RoSy field
|
|
|
|
|
+VectorXd S;
|
|
|
|
|
+igl::copyleft::comiso::nrosy(V, F, b, bc, VectorXi(), VectorXd(), MatrixXd(), 4, 0.5, X1, S);
|
|
|
|
|
|
|
|
-// // Find the orthogonal vector
|
|
|
|
|
-// MatrixXd B1, B2, B3;
|
|
|
|
|
-// igl::local_basis(V, F, B1, B2, B3);
|
|
|
|
|
-// X2 = igl::rotate_vectors(X1, VectorXd::Constant(1, igl::PI / 2), B1, B2);
|
|
|
|
|
|
|
+// Find the orthogonal vector
|
|
|
|
|
+MatrixXd B1, B2, B3;
|
|
|
|
|
+igl::local_basis(V, F, B1, B2, B3);
|
|
|
|
|
+X2 = igl::rotate_vectors(X1, VectorXd::Constant(1, igl::PI / 2), B1, B2);
|
|
|
|
|
|
|
|
-// // Always work on the bisectors, it is more general
|
|
|
|
|
-// igl::compute_frame_field_bisectors(V, F, X1, X2, BIS1, BIS2);
|
|
|
|
|
|
|
+// Always work on the bisectors, it is more general
|
|
|
|
|
+igl::compute_frame_field_bisectors(V, F, X1, X2, BIS1, BIS2);
|
|
|
|
|
|
|
|
-// // Comb the field, implicitly defining the seams
|
|
|
|
|
-// igl::comb_cross_field(V, F, BIS1, BIS2, BIS1_combed, BIS2_combed);
|
|
|
|
|
|
|
+// Comb the field, implicitly defining the seams
|
|
|
|
|
+igl::comb_cross_field(V, F, BIS1, BIS2, BIS1_combed, BIS2_combed);
|
|
|
|
|
|
|
|
-// // Find the integer mismatches
|
|
|
|
|
-// igl::cross_field_mismatch(V, F, BIS1_combed, BIS2_combed, true, MMatch);
|
|
|
|
|
|
|
+// Find the integer mismatches
|
|
|
|
|
+ igl::cross_field_mismatch(V, F, BIS1_combed, BIS2_combed, true, MMatch);
|
|
|
|
|
|
|
|
-// // Find the singularities
|
|
|
|
|
-// igl::find_cross_field_singularities(V, F, MMatch, isSingularity, singularityIndex);
|
|
|
|
|
|
|
+// Find the singularities
|
|
|
|
|
+igl::find_cross_field_singularities(V, F, MMatch, isSingularity, singularityIndex);
|
|
|
|
|
|
|
|
-// // Cut the mesh, duplicating all vertices on the seams
|
|
|
|
|
-// igl::cut_mesh_from_singularities(V, F, MMatch, Seams);
|
|
|
|
|
|
|
+// Cut the mesh, duplicating all vertices on the seams
|
|
|
|
|
+igl::cut_mesh_from_singularities(V, F, MMatch, Seams);
|
|
|
|
|
|
|
|
-// // Comb the frame-field accordingly
|
|
|
|
|
-// igl::comb_frame_field(V, F, X1, X2, BIS1_combed, BIS2_combed, X1_combed, X2_combed);
|
|
|
|
|
|
|
+// Comb the frame-field accordingly
|
|
|
|
|
+igl::comb_frame_field(V, F, X1, X2, BIS1_combed, BIS2_combed, X1_combed, X2_combed);
|
|
|
|
|
|
|
|
-// // Global parametrization
|
|
|
|
|
-// igl::copyleft::comiso::miq(V,
|
|
|
|
|
-// F,
|
|
|
|
|
-// X1_combed,
|
|
|
|
|
-// X2_combed,
|
|
|
|
|
-// MMatch,
|
|
|
|
|
-// isSingularity,
|
|
|
|
|
-// Seams,
|
|
|
|
|
-// UV,
|
|
|
|
|
-// FUV,
|
|
|
|
|
-// gradient_size,
|
|
|
|
|
-// stiffness,
|
|
|
|
|
-// direct_round,
|
|
|
|
|
-// iter,
|
|
|
|
|
-// 5,
|
|
|
|
|
-// true);
|
|
|
|
|
|
|
+// Global parametrization
|
|
|
|
|
+igl::copyleft::comiso::miq(V,
|
|
|
|
|
+ F,
|
|
|
|
|
+ X1_combed,
|
|
|
|
|
+ X2_combed,
|
|
|
|
|
+ MMatch,
|
|
|
|
|
+ isSingularity,
|
|
|
|
|
+ Seams,
|
|
|
|
|
+ UV,
|
|
|
|
|
+ FUV,
|
|
|
|
|
+ gradient_size,
|
|
|
|
|
+ stiffness,
|
|
|
|
|
+ direct_round,
|
|
|
|
|
+ iter,
|
|
|
|
|
+ 5,
|
|
|
|
|
+ true);
|
|
|
|
|
|
|
|
-// // Refresh the test data
|
|
|
|
|
-// // igl::writeDMAT(test_common::data_path("3holes-miq-UV.dmat"),UV);
|
|
|
|
|
-// // igl::writeDMAT(test_common::data_path("3holes-miq-FUV.dmat"),FUV);
|
|
|
|
|
|
|
+ // Refresh the test data
|
|
|
|
|
+ // igl::writeDMAT(test_common::data_path("3holes-miq-UV.dmat"),UV);
|
|
|
|
|
+ // igl::writeDMAT(test_common::data_path("3holes-miq-FUV.dmat"),FUV);
|
|
|
|
|
|
|
|
-// igl::readDMAT(test_common::data_path("3holes-miq-UV.dmat"),UV_ref);
|
|
|
|
|
-// igl::readDMAT(test_common::data_path("3holes-miq-FUV.dmat"),FUV_ref);
|
|
|
|
|
|
|
+ igl::readDMAT(test_common::data_path("3holes-miq-UV.dmat"),UV_ref);
|
|
|
|
|
+ igl::readDMAT(test_common::data_path("3holes-miq-FUV.dmat"),FUV_ref);
|
|
|
|
|
|
|
|
-// REQUIRE (1e-6 > (UV-UV_ref).array().abs().maxCoeff());
|
|
|
|
|
-// REQUIRE (1e-6 > (FUV-FUV_ref).array().abs().maxCoeff());
|
|
|
|
|
-// }
|
|
|
|
|
|
|
+ REQUIRE (1e-6 > (UV-UV_ref).array().abs().maxCoeff());
|
|
|
|
|
+ REQUIRE (1e-6 > (FUV-FUV_ref).array().abs().maxCoeff());
|
|
|
|
|
+}
|