|
@@ -8,6 +8,10 @@
|
|
|
#include <igl/n_polyvector.h>
|
|
|
#include <igl/conjugate_frame_fields.h>
|
|
|
#include <stdlib.h>
|
|
|
+#include <igl/readOFF.h>
|
|
|
+#include <igl/jet.h>
|
|
|
+#include <igl/quad_planarity.h>
|
|
|
+#include <igl/planarize_quad_mesh.h>
|
|
|
|
|
|
// Input mesh
|
|
|
Eigen::MatrixXd V;
|
|
@@ -16,6 +20,18 @@ Eigen::MatrixXi F;
|
|
|
// Face barycenters
|
|
|
Eigen::MatrixXd B;
|
|
|
|
|
|
+
|
|
|
+// Quad mesh generated from smooth field
|
|
|
+Eigen::MatrixXd VQS;
|
|
|
+Eigen::MatrixXi FQS;
|
|
|
+Eigen::MatrixXi FQStri;
|
|
|
+
|
|
|
+// Quad mesh generated from conjugate field
|
|
|
+Eigen::MatrixXd VQC;
|
|
|
+Eigen::MatrixXi FQC;
|
|
|
+Eigen::MatrixXi FQCtri;
|
|
|
+Eigen::MatrixXd VQCplan;
|
|
|
+
|
|
|
// Scale for visualizing the fields
|
|
|
double global_scale;
|
|
|
|
|
@@ -40,21 +56,22 @@ bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
|
|
|
using namespace std;
|
|
|
using namespace Eigen;
|
|
|
|
|
|
- if (key <'1' || key >'3')
|
|
|
+ if (key <'1' || key >'6')
|
|
|
return false;
|
|
|
|
|
|
viewer.clear_mesh();
|
|
|
- viewer.set_mesh(V, F);
|
|
|
viewer.options.show_lines = false;
|
|
|
viewer.options.show_texture = false;
|
|
|
-
|
|
|
- // Highlight in red the constrained faces
|
|
|
- MatrixXd C = MatrixXd::Constant(F.rows(),3,1);
|
|
|
- for (unsigned i=0; i<F.rows();++i)
|
|
|
- if (isConstrained[i])
|
|
|
- C.row(i) << 1, 0, 0;
|
|
|
- viewer.set_colors(C);
|
|
|
-
|
|
|
+ if (key <= '3')
|
|
|
+ {
|
|
|
+ viewer.set_mesh(V, F);
|
|
|
+ // Highlight in red the constrained faces
|
|
|
+ MatrixXd C = MatrixXd::Constant(F.rows(),3,1);
|
|
|
+ for (unsigned i=0; i<F.rows();++i)
|
|
|
+ if (isConstrained[i])
|
|
|
+ C.row(i) << 1, 0, 0;
|
|
|
+ viewer.set_colors(C);
|
|
|
+ }
|
|
|
|
|
|
if (key == '1')
|
|
|
{
|
|
@@ -69,7 +86,7 @@ bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
|
|
|
}
|
|
|
viewer.add_edges (B - global_scale*F1_t, B + global_scale*F1_t , Eigen::RowVector3d(0,0,1));
|
|
|
viewer.add_edges (B - global_scale*F2_t, B + global_scale*F2_t , Eigen::RowVector3d(0,0,1));
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
if (key == '2')
|
|
|
{
|
|
@@ -80,7 +97,7 @@ bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
|
|
|
B + global_scale*smooth_pvf.block(0,3,F.rows(),3),
|
|
|
Eigen::RowVector3d(0,1,0));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (key == '3')
|
|
|
{
|
|
|
if (totalConjIter <50)
|
|
@@ -99,6 +116,48 @@ bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
|
|
|
Eigen::RowVector3d(0,1,0));
|
|
|
}
|
|
|
|
|
|
+ if (key == '4')
|
|
|
+ {
|
|
|
+ viewer.set_mesh(VQS, FQStri);
|
|
|
+
|
|
|
+ // show planarity
|
|
|
+ VectorXd planarity;
|
|
|
+ igl::quad_planarity( VQS, FQS, planarity);
|
|
|
+ MatrixXd Ct;
|
|
|
+ igl::jet(planarity, 0, 0.02, Ct);
|
|
|
+ MatrixXd C(FQStri.rows(),3);
|
|
|
+ C << Ct, Ct;
|
|
|
+ viewer.set_colors(C);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key == '5')
|
|
|
+ {
|
|
|
+ viewer.set_mesh(VQC, FQCtri);
|
|
|
+
|
|
|
+ // show planarity
|
|
|
+ VectorXd planarity;
|
|
|
+ igl::quad_planarity( VQC, FQC, planarity);
|
|
|
+ MatrixXd Ct;
|
|
|
+ igl::jet(planarity, 0, 0.02, Ct);
|
|
|
+ MatrixXd C(FQCtri.rows(),3);
|
|
|
+ C << Ct, Ct;
|
|
|
+ viewer.set_colors(C);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key == '6')
|
|
|
+ {
|
|
|
+ igl ::planarize_quad_mesh(VQC, FQC, 50, 0.01, VQCplan);
|
|
|
+ viewer.set_mesh(VQCplan, FQCtri);
|
|
|
+
|
|
|
+ // show planarity
|
|
|
+ VectorXd planarity;
|
|
|
+ igl::quad_planarity( VQCplan, FQC, planarity);
|
|
|
+ MatrixXd Ct;
|
|
|
+ igl::jet(planarity, 0, 0.02, Ct);
|
|
|
+ MatrixXd C(FQCtri.rows(),3);
|
|
|
+ C << Ct, Ct;
|
|
|
+ viewer.set_colors(C);
|
|
|
+ }
|
|
|
|
|
|
return false;
|
|
|
}
|
|
@@ -128,7 +187,21 @@ int main(int argc, char *argv[])
|
|
|
// Initialize conjugate field with smooth field
|
|
|
csdata = new igl::ConjugateFFSolverData<Eigen::MatrixXd,Eigen::MatrixXi>(V,F);
|
|
|
conjugate_pvf = smooth_pvf;
|
|
|
-
|
|
|
+
|
|
|
+ // Load quad mesh generated by smooth field
|
|
|
+ igl::readOFF("../shared/inspired_mesh_quads_Smooth.off", VQS, FQS);
|
|
|
+ FQStri.resize(2*FQS.rows(), 3);
|
|
|
+ FQStri << FQS.col(0),FQS.col(1),FQS.col(2),
|
|
|
+ FQS.col(2),FQS.col(3),FQS.col(0);
|
|
|
+
|
|
|
+ // Load quad mesh generated by conjugate field
|
|
|
+ igl::readOFF("../shared/inspired_mesh_quads_Conjugate.off", VQC, FQC);
|
|
|
+ FQCtri.resize(2*FQC.rows(), 3);
|
|
|
+ FQCtri << FQC.col(0),FQC.col(1),FQC.col(2),
|
|
|
+ FQC.col(2),FQC.col(3),FQC.col(0);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
igl::Viewer viewer;
|
|
|
|
|
|
// Plot the original mesh with a texture parametrization
|