Browse Source

Merge commit '144c3f008c45a3151c394b74eb511de9b7d6d55f [formerly 807b0e55f5fe13bbfe501076912deed94980aaf0]'

# Conflicts:
#	optional/index.html
#	tutorial/CMakeLists.txt
#	tutorial/tutorial.html


Former-commit-id: 6cdadb0ba827cf7f329ae3658e0c79dbef7d3421
Daniele Panozzo 7 years ago
parent
commit
9584791899

+ 182 - 0
include/igl/shapeup.cpp

@@ -0,0 +1,182 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Amir Vaxman <avaxman@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <igl/shapeup.h>
+#include <igl/min_quad_with_fixed.h>
+#include <igl/igl_inline.h>
+#include <igl/setdiff.h>
+#include <igl/cat.h>
+#include <Eigen/Core>
+#include <vector>
+
+namespace igl
+{
+  
+  template <
+  typename DerivedP,
+  typename DerivedSC,
+  typename DerivedS,
+  typename Derivedw>
+  IGL_INLINE bool shapeup_precomputation(const Eigen::PlainObjectBase<DerivedP>& P,
+                                         const Eigen::PlainObjectBase<DerivedSC>& SC,
+                                         const Eigen::PlainObjectBase<DerivedS>& S,
+                                         const Eigen::PlainObjectBase<DerivedS>& E,
+                                         const Eigen::PlainObjectBase<DerivedSC>& b,
+                                         const Eigen::PlainObjectBase<Derivedw>& wShape,
+                                         const Eigen::PlainObjectBase<Derivedw>& wSmooth,
+                                         ShapeupData & sudata)
+  {
+      using namespace std;
+      using namespace Eigen;
+      sudata.P=P;
+      sudata.SC=SC;
+      sudata.S=S;
+      sudata.b=b;
+      typedef typename DerivedP::Scalar Scalar;
+      
+      //checking for consistency of the input
+      assert(SC.rows()==S.rows());
+      assert(SC.rows()==wShape.rows());
+      assert(E.rows()==wSmooth.rows());
+      assert(b.rows()!=0);  //would lead to matrix becoming SPD
+      
+      sudata.DShape.conservativeResize(SC.sum(), P.rows());  //Shape matrix (integration);
+      sudata.DClose.conservativeResize(b.rows(), P.rows());  //Closeness matrix for positional constraints
+      sudata.DSmooth.conservativeResize(E.rows(), P.rows());  //smoothness matrix
+        
+      //Building shape matrix
+      std::vector<Triplet<Scalar> > DShapeTriplets;
+      int currRow=0;
+      for (int i=0;i<S.rows();i++){
+          Scalar avgCoeff=1.0/(Scalar)SC(i);
+            
+          for (int j=0;j<SC(i);j++){
+            for (int k=0;k<SC(i);k++){
+              if (j==k)
+                DShapeTriplets.push_back(Triplet<Scalar>(currRow+j, S(i,k), (1.0-avgCoeff)));
+              else
+                DShapeTriplets.push_back(Triplet<Scalar>(currRow+j, S(i,k), (-avgCoeff)));
+            }
+          }
+        currRow+=SC(i);
+        
+      }
+ 
+      sudata.DShape.setFromTriplets(DShapeTriplets.begin(), DShapeTriplets.end());
+
+      //Building closeness matrix
+      std::vector<Triplet<Scalar> > DCloseTriplets;
+      for (int i=0;i<b.size();i++)
+        DCloseTriplets.push_back(Triplet<Scalar>(i,b(i), 1.0));
+      
+      sudata.DClose.setFromTriplets(DCloseTriplets.begin(), DCloseTriplets.end());
+      
+      //Building smoothness matrix
+      std::vector<Triplet<Scalar> > DSmoothTriplets;
+      for (int i=0; i<E.rows(); i++) {
+        DSmoothTriplets.push_back(Triplet<Scalar>(i, E(i, 0), -1));
+        DSmoothTriplets.push_back(Triplet<Scalar>(i, E(i, 1), 1));
+      }
+        
+      SparseMatrix<Scalar> tempMat;
+      igl::cat(1, sudata.DShape, sudata.DClose, tempMat);
+      igl::cat(1, tempMat, sudata.DSmooth, sudata.A);
+        
+      //weight matrix
+      vector<Triplet<Scalar> > WTriplets;
+        
+      //one weight per set in S.
+      currRow=0;
+      for (int i=0;i<SC.rows();i++){
+          for (int j=0;j<SC(i);j++)
+              WTriplets.push_back(Triplet<double>(currRow+j,currRow+j,sudata.shapeCoeff*wShape(i)));
+          currRow+=SC(i);
+      }
+        
+      for (int i=0;i<b.size();i++)
+          WTriplets.push_back(Triplet<double>(SC.sum()+i, SC.sum()+i, sudata.closeCoeff));
+        
+      for (int i=0;i<E.rows();i++)
+          WTriplets.push_back(Triplet<double>(SC.sum()+b.size()+i, SC.sum()+b.size()+i, sudata.smoothCoeff*wSmooth(i)));
+        
+      sudata.W.conservativeResize(SC.sum()+b.size()+E.rows(), SC.sum()+b.size()+E.rows());
+      sudata.W.setFromTriplets(WTriplets.begin(), WTriplets.end());
+        
+      sudata.At=sudata.A.transpose();  //for efficieny, as we use the transpose a lot in the iteration
+      sudata.Q=sudata.At*sudata.W*sudata.A;
+
+      return min_quad_with_fixed_precompute(sudata.Q,VectorXi(),SparseMatrix<double>(),true,sudata.solver_data);
+  }
+
+
+  template <
+  typename DerivedP,
+  typename DerivedSC,
+  typename DerivedS>
+  IGL_INLINE bool shapeup_solve(const Eigen::PlainObjectBase<DerivedP>& bc,
+                                const std::function<bool(const Eigen::PlainObjectBase<DerivedP>&, const Eigen::PlainObjectBase<DerivedSC>&, const Eigen::PlainObjectBase<DerivedS>&,  Eigen::PlainObjectBase<DerivedP>&)>& local_projection,
+                                const Eigen::PlainObjectBase<DerivedP>& P0,
+                                const ShapeupData & sudata,
+                                const bool quietIterations,
+                                Eigen::PlainObjectBase<DerivedP>& P)
+  {
+    using namespace Eigen;
+    using namespace std;
+    MatrixXd currP=P0;
+    MatrixXd prevP=P0;
+    MatrixXd projP;
+    
+    assert(bc.rows()==sudata.b.rows());
+    
+		MatrixXd rhs(sudata.A.rows(), 3); rhs.setZero();
+    rhs.block(sudata.DShape.rows(), 0, sudata.b.rows(),3)=bc;  //this stays constant throughout the iterations
+        
+    if (!quietIterations){
+        cout<<"Shapeup Iterations, "<<sudata.DShape.rows()<<" constraints, solution size "<<P0.size()<<endl;
+        cout<<"**********************************************************************************************"<<endl;
+    }
+    projP.conservativeResize(sudata.SC.rows(), 3*sudata.SC.maxCoeff());
+    for (int iter=0;iter<sudata.maxIterations;iter++){
+      
+      local_projection(currP, sudata.SC,sudata.S,projP);
+            
+      //constructing the projection part of the (DShape rows of the) right hand side
+      int currRow=0;
+      for (int i=0;i<sudata.S.rows();i++)
+        for (int j=0;j<sudata.SC(i);j++)
+          rhs.row(currRow++)=projP.block(i, 3*j, 1,3);
+      
+      Eigen::PlainObjectBase<DerivedP> lsrhs=-sudata.At*sudata.W*rhs;
+      MatrixXd Y(0,3), Beq(0,3);  //We do not use the min_quad_solver fixed variables mechanism; they are treated with the closeness energy of ShapeUp.
+      min_quad_with_fixed_solve(sudata.solver_data, lsrhs,Y,Beq,currP);
+      
+      double currChange=(currP-prevP).lpNorm<Infinity>();
+      if (!quietIterations)
+        cout << "Iteration "<<iter<<", integration Linf error: "<<currChange<< endl;
+      prevP=currP;
+      if (currChange<sudata.pTolerance){
+        P=currP;
+        return true;
+      }
+    }
+    
+    P=currP;
+    return false;  //we went over maxIterations
+    
+  }
+}
+
+
+
+
+
+#ifdef IGL_STATIC_LIBRARY
+template bool igl::shapeup_precomputation< typename Eigen::Matrix<double, -1, -1, 0, -1, -1>, typename Eigen::Matrix<int, -1, 1, 0, -1, 1>, typename Eigen::Matrix<int, -1, -1, 0, -1, -1>, typename Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&,   Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, igl::ShapeupData&);
+
+template bool igl::shapeup_solve<typename Eigen::Matrix<double, -1, -1, 0, -1, -1>, typename Eigen::Matrix<int, -1, 1, 0, -1, 1>, typename Eigen::Matrix<int, -1, -1, 0, -1, -1> >(const Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >& bc, const std::function<bool(const Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, const Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, const Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&,  Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >& ) >& local_projection, const Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >& P0, const igl::ShapeupData & sudata, const bool quietIterations, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >& P);
+#endif

+ 113 - 0
include/igl/shapeup.h

@@ -0,0 +1,113 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Amir Vaxman <avaxman@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
+#ifndef IGL_SHAPEUP_H
+#define IGL_SHAPEUP_H
+
+#include <igl/shapeup_local_projections.h>
+#include <igl/min_quad_with_fixed.h>
+#include <igl/igl_inline.h>
+#include <igl/setdiff.h>
+#include <igl/cat.h>
+#include <Eigen/Core>
+#include <vector>
+
+
+//This file implements the following algorithm:
+
+//Boaziz et al.
+//Shape-Up: Shaping Discrete Geometry with Projections
+//Computer Graphics Forum (Proc. SGP) 31(5), 2012
+
+namespace igl
+{
+  struct ShapeupData{
+    //input data
+    Eigen::MatrixXd P;
+    Eigen::VectorXi SC;
+    Eigen::MatrixXi S;
+    Eigen::VectorXi b;
+    int maxIterations; //referring to number of local-global pairs.
+    double pTolerance;   //algorithm stops when max(|P_k-P_{k-1}|)<pTolerance.
+    double shapeCoeff, closeCoeff, smoothCoeff;
+          
+    //Internally-used matrices
+    Eigen::SparseMatrix<double> DShape, DClose, DSmooth, Q, A, At, W;
+          
+    min_quad_with_fixed_data<double> solver_data;
+          
+    ShapeupData():
+    maxIterations(50),
+    pTolerance(10e-6),
+    shapeCoeff(1.0),
+    closeCoeff(100.0),
+    smoothCoeff(0.0){}
+  };
+      
+    
+    
+  //This function precomputation the necessary matrices for the ShapeUp process, and prefactorizes them.
+    
+  //input:
+  //  P   #P by 3             point positions
+  //  SC  #Set by 1           cardinalities of sets in S
+  //  S   #Sets by max(SC)    independent sets where the local projection applies. Values beyond column SC(i)-1 in row S(i,:) are "don't care"
+  //  E   #E by 2             the "edges" of the set P; used for the smoothness energy.
+  //  b   #b by 1             boundary (fixed) vertices from P.
+  //  wShape,   #Set by 1
+  //  wSmooth   #b by 1       weights for constraints from S and positional constraints (used in the global step)
+
+  // Output:
+  //  sudata struct ShapeupData     the data necessary to solve the system in shapeup_solve
+
+  template <
+  typename DerivedP,
+  typename DerivedSC,
+  typename DerivedS,
+  typename Derivedw>
+  IGL_INLINE bool shapeup_precomputation(const Eigen::PlainObjectBase<DerivedP>& P,
+                                         const Eigen::PlainObjectBase<DerivedSC>& SC,
+                                         const Eigen::PlainObjectBase<DerivedS>& S,
+                                         const Eigen::PlainObjectBase<DerivedS>& E,
+                                         const Eigen::PlainObjectBase<DerivedSC>& b,
+                                         const Eigen::PlainObjectBase<Derivedw>& wShape,
+                                         const Eigen::PlainObjectBase<Derivedw>& wSmooth,
+                                         ShapeupData & sudata);
+    
+    
+    
+  //This function solve the shapeup project optimization. shapeup_precompute must be called before with the same sudata, or results are unpredictable
+    
+  //Input:
+  //bc                #b by 3 fixed point values corresonding to "b" in sudata
+  //local_projection  function pointer taking (P,SC,S,projP),
+  // where the first three parameters are as defined, and "projP" is the output, as a #S by 3*max(SC) function in format xyzxyzxyz, and where it returns the projected points corresponding to each set in S in the same order.
+  //NOTE: the input values in P0 don't need to correspond to prescribed values in bc; the iterations will project them automatically (by design).
+  //P0                #P by 3 initial solution (point positions)
+  //sudata            the ShapeUpData structure computed in shapeup_precomputation()
+  //quietIterations   flagging if to output iteration information.
+
+  //Output:
+  //P                 the solution to the problem, indices corresponding to P0.
+  template <
+  typename DerivedP,
+  typename DerivedSC,
+  typename DerivedS>
+  IGL_INLINE bool shapeup_solve(const Eigen::PlainObjectBase<DerivedP>& bc,
+                                const std::function<bool(const Eigen::PlainObjectBase<DerivedP>&, const Eigen::PlainObjectBase<DerivedSC>&, const Eigen::PlainObjectBase<DerivedS>&,  Eigen::PlainObjectBase<DerivedP>&)>& local_projection,
+                                const Eigen::PlainObjectBase<DerivedP>& P0,
+                                const ShapeupData & sudata,
+                                const bool quietIterations,
+                                Eigen::PlainObjectBase<DerivedP>& P);
+  
+}
+
+#ifndef IGL_STATIC_LIBRARY
+#include "shapeup.cpp"
+#endif
+
+#endif

+ 78 - 0
include/igl/shapeup_local_projections.cpp

@@ -0,0 +1,78 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Amir Vaxman <avaxman@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <igl/shapeup_local_projections.h>
+#include <igl/igl_inline.h>
+#include <igl/setdiff.h>
+#include <igl/cat.h>
+#include <Eigen/Core>
+#include <vector>
+
+
+//This file implements several basic local projection functions for the shapeup algorithm in shapeup.h
+
+namespace igl
+{
+  
+  //This projection does nothing but render points into projP. Mostly used for "echoing" the global step
+  IGL_INLINE bool shapeup_identity_projection(const Eigen::PlainObjectBase<Eigen::MatrixXd>& P, const Eigen::PlainObjectBase<Eigen::VectorXi>& SC, const Eigen::PlainObjectBase<Eigen::MatrixXi>& S,  Eigen::PlainObjectBase<Eigen::MatrixXd>& projP){
+    projP.conservativeResize(SC.rows(), 3*SC.maxCoeff());
+    for (int i=0;i<S.rows();i++){
+      Eigen::RowVector3d avgCurrP=Eigen::RowVector3d::Zero();
+      for (int j=0;j<SC(i);j++)
+        avgCurrP+=P.row(S(i,j))/(double)(SC(i));
+  
+      for (int j=0;j<SC(i);j++)
+        projP.block(i,3*j,1,3)=P.row(S(i,j))-avgCurrP;
+    }
+    return true;
+  }
+  
+  
+  //the projection assumes that the sets are vertices of polygons in order
+  IGL_INLINE bool shapeup_regular_face_projection(const Eigen::PlainObjectBase<Eigen::MatrixXd>& P, const Eigen::PlainObjectBase<Eigen::VectorXi>& SC, const Eigen::PlainObjectBase<Eigen::MatrixXi>& S,  Eigen::PlainObjectBase<Eigen::MatrixXd>& projP){
+    projP.conservativeResize(SC.rows(), 3*SC.maxCoeff());
+    for (int currRow=0;currRow<SC.rows();currRow++){
+    //computing average
+      int N=SC(currRow);
+      const Eigen::RowVectorXi SRow=S.row(currRow);
+      Eigen::RowVector3d avgCurrP=Eigen::RowVector3d::Zero();
+      Eigen::MatrixXd targetPolygon(N, 3);
+      Eigen::MatrixXd sourcePolygon(N, 3);
+      for (int j=0;j<N;j++)
+        avgCurrP+=P.row(SRow(j))/(double)(N);
+  
+      for (int j=0;j<N;j++)
+        targetPolygon.row(j)=P.row(SRow(j))-avgCurrP;
+  
+      //creating perfectly regular source polygon
+      for (int j=0;j<N;j++)
+        sourcePolygon.row(j)<<cos(2*M_PI*(double)j/(double(N))), sin(2*M_PI*(double)j/(double(N))),0.0;
+  
+      //finding closest similarity transformation between source and target
+      Eigen::MatrixXd corrMat=sourcePolygon.transpose()*targetPolygon;
+      Eigen::JacobiSVD<Eigen::Matrix3d> svd(corrMat, Eigen::ComputeFullU | Eigen::ComputeFullV);
+      Eigen::MatrixXd R=svd.matrixU()*svd.matrixV().transpose();
+      //getting scale by edge length change average. TODO: by singular values
+      Eigen::VectorXd sourceEdgeLengths(N);
+      Eigen::VectorXd targetEdgeLengths(N);
+      for (int j=0;j<N;j++){
+        sourceEdgeLengths(j)=(sourcePolygon.row((j+1)%N)-sourcePolygon.row(j)).norm();
+        targetEdgeLengths(j)=(targetPolygon.row((j+1)%N)-targetPolygon.row(j)).norm();
+      }
+      double scale=(targetEdgeLengths.cwiseQuotient(sourceEdgeLengths)).mean();
+  
+      for (int j=0;j<N;j++)
+        projP.block(currRow,3*j,1,3)=sourcePolygon.row(j)*R*scale;
+    }
+  
+    return true;
+  }
+
+}
+

+ 46 - 0
include/igl/shapeup_local_projections.h

@@ -0,0 +1,46 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Amir Vaxman <avaxman@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
+#ifndef IGL_SHAPEUP_LOCAL_PROJECTIONS_H
+#define IGL_SHAPEUP_LOCAL_PROJECTIONS_H
+
+#include <igl/igl_inline.h>
+#include <igl/setdiff.h>
+#include <igl/cat.h>
+#include <Eigen/Core>
+#include <vector>
+
+
+
+
+namespace igl
+{
+
+	//Every function here defines a local projection for ShapeUp, and must have the following structure to qualify:
+	//Input:
+	//	P		#P by 3				the set of points, either the initial solution, or from previous iteration.
+	//  SC		#Set by 1           cardinalities of sets in S
+	//  S		#Sets by max(SC)    independent sets where the local projection applies. Values beyond column SC(i)-1 in row S(i,:) are "don't care"
+	//Output:
+	//	projP	#S by 3*max(SC) in format xyzxyzxyz,  where the projected points correspond to each set in S in the same order.
+	typedef std::function<bool(const Eigen::PlainObjectBase<Eigen::MatrixXd>&, const Eigen::PlainObjectBase<Eigen::VectorXi>&, const Eigen::PlainObjectBase<Eigen::MatrixXi>&, Eigen::PlainObjectBase<Eigen::MatrixXd>&)> shapeup_projection_function;
+
+  
+  //This projection does nothing but render points into projP. Mostly used for "echoing" the global step
+  IGL_INLINE bool shapeup_identity_projection(const Eigen::PlainObjectBase<Eigen::MatrixXd>& P, const Eigen::PlainObjectBase<Eigen::VectorXi>& SC, const Eigen::PlainObjectBase<Eigen::MatrixXi>& S,  Eigen::PlainObjectBase<Eigen::MatrixXd>& projP);
+  
+  //the projection assumes that the sets are vertices of polygons in cyclic order
+  IGL_INLINE bool shapeup_regular_face_projection(const Eigen::PlainObjectBase<Eigen::MatrixXd>& P, const Eigen::PlainObjectBase<Eigen::VectorXi>& SC, const Eigen::PlainObjectBase<Eigen::MatrixXi>& S,  Eigen::PlainObjectBase<Eigen::MatrixXd>& projP);
+  
+ 
+}
+
+#ifndef IGL_STATIC_LIBRARY
+#include "shapeup_local_projections.cpp"
+#endif
+
+#endif

+ 5 - 0
tutorial/713_ShapeUp/CMakeLists.txt

@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(713_ShapeUp)
+
+add_executable(${PROJECT_NAME}_bin main.cpp)
+target_link_libraries(${PROJECT_NAME}_bin igl::core igl::opengl igl::opengl_glfw tutorials)

+ 156 - 0
tutorial/713_ShapeUp/main.cpp

@@ -0,0 +1,156 @@
+#include <igl/avg_edge_length.h>
+#include <igl/barycenter.h>
+#include <igl/jet.h>
+#include <igl/shapeup.h>
+#include <igl/shapeup_local_projections.h>
+#include <igl/quad_planarity.h>
+#include <igl/readDMAT.h>
+#include <igl/readOFF.h>
+#include <igl/slice.h>
+#include <igl/opengl/glfw/Viewer.h>
+#include <igl/PI.h>
+#include <vector>
+#include <cstdlib>
+
+#include "tutorial_shared_path.h"
+
+// Quad mesh loaded
+Eigen::MatrixXd VQC;
+Eigen::MatrixXi FQC;
+Eigen::MatrixXi E;
+Eigen::MatrixXi FQCtri;
+Eigen::MatrixXd PQC0, PQC1, PQC2, PQC3;
+// Euclidean-regular quad mesh
+Eigen::MatrixXd VQCregular;
+Eigen::MatrixXi FQCtriregular;
+Eigen::MatrixXd PQC0regular, PQC1regular, PQC2regular, PQC3regular;
+
+igl::ShapeupData su_data;
+
+
+
+// Scale for visualizing the fields
+double global_scale; //TODO: not used
+
+void quadAngleRegularity(const Eigen::MatrixXd& V, const Eigen::MatrixXi& Q, Eigen::VectorXd& angleRegularity)
+{
+  angleRegularity.conservativeResize(Q.rows());
+  angleRegularity.setZero();
+  for (int i=0;i<Q.rows();i++){
+    for (int j=0;j<4;j++){
+      Eigen::RowVectorXd v21=(V.row(Q(i,j))-V.row(Q(i,(j+1)%4))).normalized();
+      Eigen::RowVectorXd v23=(V.row(Q(i,(j+2)%4))-V.row(Q(i,(j+1)%4))).normalized();
+  
+      angleRegularity(i)+=(abs(acos(v21.dot(v23))-igl::PI/2.0)/(igl::PI/2.0))/4.0;
+    }
+  }
+}
+
+
+bool key_down(igl::opengl::glfw::Viewer& viewer, unsigned char key, int modifier)
+{
+  using namespace std;
+  using namespace Eigen;
+
+  // Plot the original quad mesh
+  
+  if (key == '1')
+  {
+    viewer.data().clear();
+    // Draw the triangulated quad mesh
+    viewer.data().set_mesh(VQC, FQCtri);
+
+    // Assign a color to each quad that corresponds to the average deviation of each angle from pi/2
+    VectorXd angleRegularity(FQC.rows());
+    quadAngleRegularity( VQC, FQC, angleRegularity);
+    MatrixXd Ct;
+    igl::jet(angleRegularity, 0.0, 0.05, Ct);
+    MatrixXd C(FQCtri.rows(),3);
+    C << Ct, Ct;
+    viewer.data().set_colors(C);
+
+    // Plot a line for each edge of the quad mesh
+    viewer.data().add_edges(PQC0, PQC1, Eigen::RowVector3d(0,0,0));
+    viewer.data().add_edges(PQC1, PQC2, Eigen::RowVector3d(0,0,0));
+    viewer.data().add_edges(PQC2, PQC3, Eigen::RowVector3d(0,0,0));
+    viewer.data().add_edges(PQC3, PQC0, Eigen::RowVector3d(0,0,0));
+  }
+
+  // Plot the planarized quad mesh
+  if (key == '2')
+  {
+    viewer.data().clear();
+    // Draw the triangulated quad mesh
+    viewer.data().set_mesh(VQCregular, FQCtri);
+
+    // Assign a color to each quad that corresponds to its planarity
+    VectorXd angleRegularity(FQC.rows());
+    quadAngleRegularity( VQCregular, FQC, angleRegularity);
+    MatrixXd Ct;
+    igl::jet(angleRegularity, 0, 0.05, Ct);
+    MatrixXd C(FQCtri.rows(),3);
+    C << Ct, Ct;
+    viewer.data().set_colors(C);
+
+    // Plot a line for each edge of the quad mesh
+    viewer.data().add_edges(PQC0regular, PQC1regular, Eigen::RowVector3d(0,0,0));
+    viewer.data().add_edges(PQC1regular, PQC2regular, Eigen::RowVector3d(0,0,0));
+    viewer.data().add_edges(PQC2regular, PQC3regular, Eigen::RowVector3d(0,0,0));
+    viewer.data().add_edges(PQC3regular, PQC0regular, Eigen::RowVector3d(0,0,0));
+  }
+
+  return false;
+}
+
+int main(int argc, char *argv[])
+{
+  using namespace Eigen;
+  using namespace std;
+
+  // Load a quad mesh
+  igl::readOFF(TUTORIAL_SHARED_PATH "/halftunnel.off", VQC, FQC);
+
+  // Convert it in a triangle mesh
+  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::slice( VQC, FQC.col(0).eval(), 1, PQC0);
+  igl::slice( VQC, FQC.col(1).eval(), 1, PQC1);
+  igl::slice( VQC, FQC.col(2).eval(), 1, PQC2);
+  igl::slice( VQC, FQC.col(3).eval(), 1, PQC3);
+
+  // Create a planar version with ShapeUp
+  //igl::planarize_quad_mesh(VQC, FQC, 100, 0.005, VQCregular);
+  
+  E.resize(FQC.size(),2);
+  E.col(0)<<FQC.col(0),FQC.col(1),FQC.col(2),FQC.col(3);
+  E.col(1)<<FQC.col(1),FQC.col(2),FQC.col(3),FQC.col(0);
+  
+  VectorXi b(1); b(0)=0;  //setting the first vertex to be the same.
+  
+  VectorXd wShape=VectorXd::Constant(FQC.rows(),1.0);
+  VectorXd wSmooth=VectorXd::Constant(E.rows(),1.0);
+  MatrixXd bc(1,3); bc<<VQC.row(0);
+  
+  VectorXi array_of_fours=VectorXi::Constant(FQC.rows(),4);
+  igl::shapeup_projection_function localFunction(igl::shapeup_regular_face_projection);
+  
+  su_data.maxIterations=200;
+  shapeup_precomputation(VQC, array_of_fours,FQC,E,b,wShape, wSmooth,su_data);
+  shapeup_solve(bc,localFunction, VQC,su_data, false,VQCregular);
+  
+
+  // Convert the planarized mesh to triangles
+  igl::slice( VQCregular, FQC.col(0).eval(), 1, PQC0regular);
+  igl::slice( VQCregular, FQC.col(1).eval(), 1, PQC1regular);
+  igl::slice( VQCregular, FQC.col(2).eval(), 1, PQC2regular);
+  igl::slice( VQCregular, FQC.col(3).eval(), 1, PQC3regular);
+
+  // Launch the viewer
+  igl::opengl::glfw::Viewer viewer;
+  key_down(viewer,'1',0);
+  viewer.data().invert_normals = true;
+  viewer.data().show_lines = false;
+  viewer.callback_key_down = &key_down;
+  viewer.launch();
+}

+ 3 - 0
tutorial/CMakeLists.txt

@@ -147,4 +147,7 @@ if(TUTORIALS_CHAPTER7)
   add_subdirectory("710_SLIM")
   add_subdirectory("711_Subdivision")
   add_subdirectory("712_DataSmoothing")
+  add_subdirectory("713_ShapeUp")
 endif()
+
+

+ 1 - 0
tutorial/images/713_ShapeUp.png.REMOVED.git-id

@@ -0,0 +1 @@
+7d8e22cf732b9663645b9cd17e86d342959cf4be

+ 1617 - 0
tutorial/shared/halftunnel.off

@@ -0,0 +1,1617 @@
+OFF
+831 784 0
+-4.04079 -1.27381 -5.79865 
+-3.90361 -1.24965 -6.07235 
+-4.03208 -0.889851 -6.13549 
+-4.19234 -0.895797 -5.83435 
+-4.2982 -0.90487 -5.47571 
+-4.13347 -1.29788 -5.46201 
+-3.92561 -1.60982 -5.44901 
+-3.84942 -1.56938 -5.7691 
+-3.74387 -1.52162 -6.01614 
+0.617179 -1.3283 -5.74127 
+0.52927 -1.30202 -5.93768 
+0.406876 -1.48908 -5.90699 
+0.476865 -1.52775 -5.72649 
+0.537996 -1.56226 -5.47205 
+0.686447 -1.35427 -5.48118 
+0.825328 -1.07632 -5.4882 
+0.748702 -1.05809 -5.7591 
+0.647295 -1.03987 -5.97349 
+-4.24519 -1.45969 -3.85539 
+-4.23157 -1.37042 -4.49503 
+-4.40824 -0.96457 -4.46184 
+-4.42607 -1.0497 -3.79214 
+-4.42916 -1.17453 -3.1199 
+-4.24225 -1.59254 -3.21409 
+-4.01719 -1.91025 -3.29765 
+-4.02663 -1.77396 -3.90795 
+-4.01486 -1.68686 -4.51887 
+0.893487 -1.4927 -4.25805 
+0.808762 -1.41658 -4.75405 
+0.66267 -1.61825 -4.75436 
+0.749063 -1.68876 -4.26686 
+0.847258 -1.79626 -3.78886 
+0.994936 -1.59979 -3.77199 
+1.14561 -1.31819 -3.73888 
+1.03985 -1.21356 -4.23463 
+0.952663 -1.13674 -4.74195 
+-4.14119 -2.0444 -1.78621 
+-4.18985 -1.89957 -2.18193 
+-4.38855 -1.46498 -2.02663 
+-4.34181 -1.60854 -1.59633 
+-4.25889 -1.78927 -1.12712 
+-4.05911 -2.22327 -1.35989 
+-3.81843 -2.54209 -1.56126 
+-3.89767 -2.37206 -1.95431 
+-3.94833 -2.22962 -2.32107 
+1.24364 -1.89153 -2.87564 
+1.17116 -1.8056 -3.11099 
+1.01087 -2.01372 -3.13655 
+1.07903 -2.1007 -2.90755 
+1.14933 -2.20148 -2.66968 
+1.31912 -1.99535 -2.6254 
+1.49384 -1.70485 -2.55018 
+1.40972 -1.60017 -2.8186 
+1.33229 -1.51502 -3.06345 
+-3.50625 -3.14218 0.240117 
+-3.72903 -2.77135 -0.339432 
+-3.89685 -2.3926 -0.0228838 
+-3.67108 -2.77108 0.544302 
+-3.46595 -3.14257 1.12638 
+-3.29304 -3.53123 0.814071 
+-3.07757 -3.80767 0.537308 
+-3.29415 -3.41584 -0.0210248 
+-3.51251 -3.05186 -0.594175 
+1.65058 -2.61914 -1.53926 
+1.49293 -2.35235 -1.95637 
+1.32225 -2.54405 -2.01793 
+1.48345 -2.81345 -1.59417 
+1.68828 -3.10276 -1.1887 
+1.85867 -2.89697 -1.13763 
+2.02933 -2.61355 -1.05012 
+1.81879 -2.36002 -1.44343 
+1.67315 -2.09223 -1.84246 
+-2.63627 -4.45867 1.97116 
+-2.88211 -4.20471 1.68664 
+-3.02017 -3.87102 2.08367 
+-2.74227 -4.1668 2.37994 
+-2.42651 -4.38869 2.57727 
+-2.36265 -4.64223 2.16121 
+-2.25148 -4.80605 1.82088 
+-2.47369 -4.66475 1.63019 
+-2.68713 -4.44633 1.35441 
+2.30523 -3.53651 -0.317506 
+2.21588 -3.34816 -0.556288 
+2.03232 -3.54763 -0.623209 
+2.12488 -3.7145 -0.396249 
+2.1586 -3.83259 -0.208444 
+2.32898 -3.68267 -0.113205 
+2.52162 -3.46792 0.0434147 
+2.50188 -3.29866 -0.177574 
+2.41385 -3.08408 -0.429975 
+-4.51049 0.848419 -6.07428 
+-4.65676 0.902434 -5.62933 
+-4.54634 0.188035 -5.54593 
+-4.41427 0.156745 -5.95858 
+-4.21586 0.121075 -6.30945 
+-4.29295 0.79288 -6.45201 
+1.19706 0.13986 -5.90087 
+1.06701 0.143437 -6.15951 
+0.890619 -0.322605 -6.07449 
+1.01265 -0.328454 -5.82949 
+1.10545 -0.327863 -5.53005 
+1.29796 0.148935 -5.58735 
+-4.86066 0.962763 -3.60719 
+-4.88321 0.901751 -2.80631 
+-4.73723 0.0671391 -2.90721 
+-4.7216 0.156254 -3.65578 
+-4.69018 0.203042 -4.40231 
+-4.82087 0.975557 -4.40341 
+1.59909 0.137421 -4.16548 
+1.47768 0.165405 -4.73508 
+1.26288 -0.345664 -4.7156 
+1.36866 -0.396956 -4.17005 
+1.4922 -0.479964 -3.64172 
+1.7379 0.0730175 -3.61294 
+-4.80995 0.513112 -0.887845 
+-4.72029 0.319581 -0.33015 
+-4.58565 -0.474027 -0.622565 
+-4.66503 -0.319599 -1.15424 
+-4.71139 -0.182604 -1.65887 
+-4.86137 0.66614 -1.44278 
+2.06621 -0.198955 -2.54369 
+1.97619 -0.102861 -2.82649 
+1.70653 -0.660567 -2.91021 
+1.79179 -0.745668 -2.6477 
+1.88339 -0.832052 -2.37731 
+2.14817 -0.306411 -2.27531 
+-2.74862 -2.65685 4.20471 
+-3.09035 -2.28944 3.85535 
+-3.13093 -1.64983 4.46178 
+-2.74703 -2.03364 4.88572 
+-2.28461 -2.35919 5.16804 
+-2.33795 -2.95928 4.44094 
+-2.40235 -3.53893 3.71809 
+-2.77633 -3.25325 3.51421 
+-3.09372 -2.88585 3.21738 
+3.34766 -2.15992 0.605855 
+3.24742 -1.93893 0.333455 
+2.9326 -2.35357 0.075193 
+3.01178 -2.59637 0.327106 
+3.03102 -2.78732 0.569162 
+3.38118 -2.34554 0.873582 
+3.76558 -1.90644 1.12448 
+3.71204 -1.7215 0.819312 
+3.57942 -1.50515 0.506495 
+-3.15157 -1.91046 -5.72241 
+-3.14233 -1.80534 -5.98742 
+-3.37774 -1.77204 -5.97885 
+-3.40886 -1.86696 -5.73072 
+-3.4474 -1.93009 -5.41405 
+-3.17286 -1.97854 -5.39592 
+-2.85591 -1.97426 -5.37865 
+-2.84962 -1.90436 -5.7157 
+-2.8538 -1.79604 -5.98978 
+-3.25761 -2.13054 -3.97741 
+-3.24771 -2.05468 -4.51126 
+-3.52787 -2.00578 -4.52468 
+-3.53867 -2.08526 -3.96485 
+-3.5122 -2.22024 -3.41027 
+-3.22037 -2.26086 -3.45051 
+-2.89544 -2.24375 -3.49339 
+-2.95164 -2.12235 -3.98592 
+-2.93614 -2.0513 -4.48496 
+-3.0452 -2.71585 -2.23178 
+-3.09393 -2.58423 -2.5629 
+-3.40404 -2.54598 -2.50572 
+-3.35351 -2.68015 -2.16865 
+-3.28687 -2.83192 -1.81087 
+-2.98389 -2.86189 -1.88613 
+-2.63698 -2.83759 -1.94579 
+-2.69607 -2.69735 -2.27773 
+-2.74258 -2.56714 -2.60527 
+-2.53661 -3.64117 -0.477143 
+-2.74525 -3.2999 -1.01387 
+-3.03313 -3.28769 -0.905878 
+-2.8244 -3.63728 -0.353797 
+-2.59657 -4.02379 0.170762 
+-2.3008 -4.01955 0.0306386 
+-1.94798 -3.95501 -0.100311 
+-2.18931 -3.58705 -0.592753 
+-2.40062 -3.25653 -1.11183 
+-1.74395 -4.79566 1.0193 
+-1.90597 -4.60704 0.742988 
+-2.20824 -4.62666 0.909256 
+-2.03774 -4.81613 1.18349 
+-1.88939 -4.92585 1.42055 
+-1.60567 -4.91205 1.27792 
+-1.25678 -4.83733 1.1377 
+-1.39227 -4.716 0.868637 
+-1.55025 -4.5276 0.592327 
+-1.56392 -1.72149 -5.727 
+-1.56097 -1.62662 -5.96649 
+-2.07102 -1.67304 -5.98167 
+-2.05839 -1.77273 -5.72592 
+-2.03205 -1.83396 -5.40541 
+-1.56244 -1.78084 -5.42879 
+-1.08272 -1.78156 -5.41116 
+-1.05958 -1.72149 -5.71228 
+-1.043 -1.62877 -5.94595 
+-1.23794 -2.48858 -2.43086 
+-1.28195 -2.39239 -2.67304 
+-1.82883 -2.44426 -2.63878 
+-1.80255 -2.55759 -2.35774 
+-1.74841 -2.67745 -2.07301 
+-1.18047 -2.59591 -2.17451 
+-0.617398 -2.55166 -2.3026 
+-0.68222 -2.44958 -2.54604 
+-0.751969 -2.35331 -2.78767 
+-0.779262 -3.25006 -0.99651 
+-0.964333 -2.94828 -1.47048 
+-1.51984 -3.05103 -1.3263 
+-1.3182 -3.36126 -0.838738 
+-1.08895 -3.71371 -0.367205 
+-0.569606 -3.59569 -0.533875 
+-0.0493381 -3.51834 -0.715989 
+-0.240172 -3.18143 -1.16882 
+-0.410361 -2.88786 -1.63099 
+-0.0724007 -4.31636 0.384035 
+-0.220318 -4.13715 0.121525 
+-0.713193 -4.268 0.302969 
+-0.56153 -4.45297 0.573897 
+-0.426485 -4.57255 0.839413 
+0.0645938 -4.43023 0.638355 
+0.549822 -4.3207 0.411449 
+0.413851 -4.21326 0.17129 
+0.27224 -4.04179 -0.0798645 
+0.00294845 -1.75773 -5.69578 
+-0.00303384 -1.67609 -5.90148 
+-0.261075 -1.68283 -5.91272 
+-0.266667 -1.77171 -5.69011 
+-0.25663 -1.83281 -5.39247 
+0.0286297 -1.81416 -5.41714 
+0.24197 -1.76516 -5.44038 
+0.201939 -1.71507 -5.70371 
+0.178611 -1.64435 -5.89084 
+0.244838 -1.9287 -4.22047 
+0.15912 -1.86444 -4.68561 
+-0.120932 -1.88561 -4.62616 
+-0.0309704 -1.94683 -4.18047 
+0.0164774 -2.0558 -3.73824 
+0.315484 -2.0407 -3.76334 
+0.546814 -1.99035 -3.78408 
+0.463828 -1.87851 -4.24931 
+0.376073 -1.81314 -4.72314 
+0.491506 -2.38746 -2.8516 
+0.427824 -2.29206 -3.09182 
+0.113008 -2.322 -3.02822 
+0.180877 -2.42215 -2.77603 
+0.250799 -2.52213 -2.53881 
+0.561136 -2.48556 -2.61885 
+0.80605 -2.4213 -2.66659 
+0.737042 -2.32421 -2.897 
+0.673958 -2.23264 -3.12832 
+0.923141 -3.08327 -1.5423 
+0.760997 -2.80562 -1.97997 
+0.452093 -2.84443 -1.89543 
+0.611094 -3.12616 -1.45094 
+0.785347 -3.44679 -1.01824 
+1.10376 -3.39749 -1.11924 
+1.35642 -3.32276 -1.1802 
+1.16457 -3.01628 -1.59495 
+0.999228 -2.74283 -2.02706 
+1.51207 -4.02194 -0.320185 
+1.39757 -3.87123 -0.5425 
+1.07295 -3.93334 -0.42419 
+1.19558 -4.08952 -0.194107 
+1.31363 -4.18421 0.0177248 
+1.61423 -4.10978 -0.124153 
+1.8543 -4.01883 -0.213286 
+1.7748 -3.9341 -0.396127 
+1.66825 -3.7849 -0.615091 
+-3.2042 -1.18986 -6.48301 
+-3.1695 -1.46839 -6.3461 
+-2.88075 -1.44642 -6.36221 
+-2.90145 -1.1654 -6.5006 
+-2.92169 -0.828636 -6.60997 
+-3.24118 -0.849806 -6.59292 
+-3.52788 -0.868245 -6.52332 
+-3.46542 -1.20906 -6.41876 
+-3.404 -1.47598 -6.29342 
+-1.33814 -4.79254 2.24608 
+-1.40754 -4.92449 1.87042 
+-1.72142 -4.93659 1.93209 
+-1.68769 -4.81314 2.29332 
+-1.6593 -4.59219 2.71189 
+-1.27873 -4.56939 2.66118 
+-0.876329 -4.4874 2.548 
+-0.954549 -4.71243 2.14219 
+-1.04076 -4.84992 1.76427 
+-3.32333 0.713558 -6.98068 
+-3.30323 0.0788411 -6.8157 
+-2.94785 0.0834682 -6.83008 
+-2.94381 0.70834 -6.99339 
+-3.66961 0.7236 -6.90497 
+-3.62867 0.0791132 -6.74209 
+-0.946518 -3.25894 4.44201 
+-1.10536 -3.80385 3.73534 
+-1.53196 -3.81178 3.81748 
+-1.4024 -3.25759 4.54318 
+-1.24568 -2.69274 5.2807 
+-0.748504 -2.70458 5.15622 
+-0.24451 -2.65023 4.94185 
+-0.475812 -3.19547 4.26085 
+-0.662288 -3.73206 3.58247 
+-1.53596 -1.09526 -6.38638 
+-1.54787 -1.33648 -6.27073 
+-1.0108 -1.35126 -6.23652 
+-0.988353 -1.1192 -6.34722 
+-0.959601 -0.829634 -6.43719 
+-1.51842 -0.795491 -6.48023 
+-2.07675 -0.78895 -6.53809 
+-2.08165 -1.10256 -6.43857 
+-2.08131 -1.35908 -6.31425 
+0.456636 -4.28804 1.51755 
+0.329604 -4.42511 1.20493 
+-0.181617 -4.57597 1.4429 
+-0.0698515 -4.43738 1.78509 
+0.0426147 -4.21609 2.14576 
+0.587965 -4.0714 1.84656 
+1.11886 -3.96451 1.52222 
+0.970394 -4.17537 1.22354 
+0.829875 -4.30961 0.939075 
+-1.36821 0.615667 -6.81547 
+-1.44456 0.0396692 -6.67207 
+-0.856483 -0.026432 -6.61968 
+-0.758714 0.524628 -6.75538 
+-1.9836 0.674487 -6.89206 
+-2.03596 0.0769919 -6.74063 
+1.23407 -2.84125 3.22847 
+0.953254 -3.34768 2.68602 
+0.353287 -3.47931 3.061 
+0.601346 -2.9604 3.65567 
+0.892456 -2.43689 4.24628 
+1.55395 -2.33299 3.76494 
+2.19197 -2.27342 3.26316 
+1.84585 -2.76489 2.77902 
+1.53493 -3.25682 2.28769 
+0.071659 -1.23065 -6.24647 
+0.0302324 -1.44026 -6.14791 
+0.208352 -1.45004 -6.09327 
+0.268424 -1.25565 -6.17865 
+0.341856 -0.992592 -6.2521 
+0.126102 -0.960245 -6.32826 
+-0.148767 -0.922107 -6.37708 
+-0.19231 -1.20011 -6.29136 
+-0.225364 -1.42166 -6.18597 
+1.99403 -3.98001 0.477764 
+1.84833 -4.09595 0.267186 
+1.57906 -4.16971 0.467476 
+1.72807 -4.04562 0.705976 
+1.89541 -3.84655 0.959305 
+2.16517 -3.78717 0.709816 
+2.36313 -3.70539 0.469603 
+2.18546 -3.89597 0.263319 
+2.0394 -4.00677 0.0912463 
+0.429531 0.268511 -6.60697 
+0.288297 -0.224672 -6.48972 
+0.531234 -0.271536 -6.40096 
+0.687342 0.207705 -6.50919 
+0.118309 0.342728 -6.6704 
+-0.00791845 -0.167064 -6.54648 
+3.01152 -2.66043 1.71726 
+2.65542 -3.11833 1.33054 
+2.37254 -3.16686 1.6187 
+2.72019 -2.6994 2.0348 
+3.10042 -2.23581 2.43884 
+3.402 -2.20768 2.08589 
+3.61954 -2.14732 1.74167 
+3.22303 -2.59155 1.4118 
+2.86337 -3.0416 1.05396 
+-1.51793 -1.18076 -4.66085 
+-1.54692 -1.66289 -4.98866 
+-1.90642 -1.6827 -4.89106 
+-1.77059 -1.18111 -4.58277 
+-1.6453 -0.439279 -4.38621 
+-1.45965 -0.448802 -4.44668 
+-1.2399 -0.467478 -4.43595 
+-1.23121 -1.18806 -4.64197 
+-1.16086 -1.65853 -4.95366 
+-1.35197 -1.37681 -3.25068 
+-1.34013 -1.98966 -3.06756 
+-0.954844 -1.95653 -3.16228 
+-1.0859 -1.37082 -3.31098 
+-1.1237 -0.577508 -3.33766 
+-1.31352 -0.56716 -3.2953 
+-1.50221 -0.549656 -3.3166 
+-1.61749 -1.36041 -3.28016 
+-1.73461 -1.98037 -3.10688 
+-2.12514 -1.25294 -3.9069 
+-2.10359 -1.21636 -4.17144 
+-2.38598 -1.76068 -4.33467 
+-2.42208 -1.82334 -3.97015 
+-2.32679 -1.88529 -3.60917 
+-2.05346 -1.29008 -3.64852 
+-1.8741 -0.486194 -3.62982 
+-1.9305 -0.461636 -3.82984 
+-1.91648 -0.444227 -4.03601 
+-0.670431 -1.29405 -3.99765 
+-0.745025 -1.25634 -4.25198 
+-0.813651 -0.533644 -4.09652 
+-0.758162 -0.554825 -3.90344 
+-0.777424 -0.571007 -3.71047 
+-0.695248 -1.32425 -3.73999 
+-0.456842 -1.85768 -3.74105 
+-0.429439 -1.7994 -4.10044 
+-0.535397 -1.73995 -4.4475 
+-4.15541 0.0104661 0.370354 
+-4.07511 -0.55609 0.142269 
+-4.3677 -0.569711 -0.0948794 
+-4.483 0.108485 0.163066 
+-3.65963 -0.0657115 0.510995 
+-3.62298 -0.512281 0.321802 
+-3.11963 -1.67051 3.10495 
+-3.12224 -2.13543 2.64109 
+-2.82679 -1.82663 2.39394 
+-2.80687 -1.43301 2.75321 
+-2.82781 -0.972288 2.93834 
+-3.1644 -1.09797 3.36093 
+-3.32787 -1.23688 3.76392 
+-3.25351 -1.89828 3.40781 
+-3.24915 -2.42602 2.85198 
+-3.54411 -2.23977 0.8307 
+-3.71464 -1.86349 0.417895 
+-3.3534 -1.64713 0.541634 
+-3.21357 -1.95699 0.881101 
+-3.06437 -2.115 1.30783 
+-3.36792 -2.43727 1.35005 
+-3.51987 -2.73954 1.33074 
+-3.71087 -2.49092 0.736433 
+-3.91641 -2.06954 0.254952 
+-1.52734 -0.174031 0.326153 
+-1.55483 -0.399403 0.233137 
+-2.32609 -0.417375 0.370658 
+-2.31117 -0.143887 0.487008 
+-0.692043 -0.222625 0.0770683 
+-0.729421 -0.418093 7.86234e-05 
+-1.00863 -0.952666 1.63651 
+-1.06474 -1.18389 1.46523 
+-0.287115 -1.10992 1.09121 
+-0.222616 -0.905883 1.2339 
+-0.192638 -0.695992 1.2919 
+-0.987534 -0.70945 1.711 
+-1.70672 -0.767164 2.11442 
+-1.71745 -1.0598 2.01616 
+-1.76468 -1.33047 1.80324 
+-1.40074 -1.32536 0.562761 
+-1.47448 -1.15815 0.379695 
+-0.68756 -1.10036 0.140338 
+-0.625101 -1.24441 0.298278 
+-0.541928 -1.31535 0.49594 
+-1.30989 -1.4077 0.792427 
+-2.00421 -1.57554 1.02725 
+-2.1081 -1.47575 0.750544 
+-2.19804 -1.27454 0.530291 
+1.68166 -0.452116 -1.23483 
+1.55225 -0.74541 -1.31155 
+0.929426 -0.602655 -0.774213 
+1.00443 -0.389838 -0.704763 
+2.07688 -0.437689 -1.76874 
+1.87423 -0.84814 -1.8463 
+2.27829 -1.28587 0.140929 
+2.11444 -1.54576 -0.0166383 
+2.63029 -1.91031 -0.12784 
+2.87992 -1.58033 0.0783549 
+3.05843 -1.1856 0.155249 
+2.38014 -0.998035 0.197201 
+1.54267 -0.841048 0.46037 
+1.48276 -1.05525 0.414356 
+1.37927 -1.2619 0.285258 
+1.58181 -1.64469 -0.884364 
+1.49733 -1.44666 -1.10162 
+1.78834 -1.72598 -1.54054 
+1.90086 -1.99316 -1.24111 
+2.08346 -2.13573 -0.886115 
+1.71222 -1.74521 -0.617932 
+1.06468 -1.44982 -0.250962 
+0.968895 -1.37531 -0.452261 
+0.906445 -1.22787 -0.614672 
+-3.70716 -1.23064 -6.28652 
+-3.59869 -1.48826 -6.18988 
+-3.8031 -0.883505 -6.37649 
+-4.31334 -0.426887 -5.8826 
+-4.13402 -0.437985 -6.20921 
+-4.43154 -0.419603 -5.4988 
+-4.19648 -1.32655 -5.02951 
+-4.36938 -0.924114 -5.01927 
+-3.98038 -1.64521 -5.03601 
+-3.62654 -1.77003 -5.74902 
+-3.68483 -1.82442 -5.43383 
+-3.56068 -1.69426 -5.98576 
+0.419206 -1.28115 -6.07841 
+0.517215 -1.02068 -6.13622 
+0.326602 -1.4642 -6.01824 
+0.341281 -1.64932 -5.71685 
+0.293538 -1.59354 -5.89375 
+0.39396 -1.69219 -5.45954 
+0.747944 -1.38159 -5.14527 
+0.597605 -1.59014 -5.14226 
+0.890925 -1.09998 -5.14223 
+0.869557 -0.73608 -5.78459 
+0.953001 -0.747654 -5.50027 
+0.75825 -0.721954 -6.01511 
+-4.58181 -0.519323 -3.72279 
+-4.55714 -0.450488 -4.42722 
+-4.59179 -0.627125 -3.01559 
+-4.22475 -1.74276 -2.67411 
+-4.41871 -1.31408 -2.55123 
+-3.98949 -2.06993 -2.78302 
+-3.78337 -1.98212 -3.94463 
+-3.76674 -2.11853 -3.3642 
+-3.77134 -1.8996 -4.52831 
+0.615289 -1.80708 -4.26321 
+0.526683 -1.74066 -4.74355 
+0.708168 -1.9164 -3.7922 
+1.08829 -1.71054 -3.40203 
+0.933213 -1.91544 -3.4219 
+1.24491 -1.4222 -3.36226 
+1.18629 -0.861904 -4.2013 
+1.29988 -0.956531 -3.69216 
+1.09155 -0.794769 -4.72471 
+-4.51493 -1.0338 -1.3844 
+-4.56049 -0.894977 -1.8517 
+-4.43432 -1.20032 -0.872839 
+-3.93303 -2.45851 -0.880254 
+-4.12413 -2.03973 -0.59811 
+-3.69978 -2.76349 -1.10982 
+-3.62702 -2.58186 -2.08411 
+-3.5533 -2.74145 -1.71293 
+-3.67839 -2.44389 -2.43156 
+0.919327 -2.23657 -2.91479 
+0.854244 -2.14777 -3.14241 
+0.98812 -2.33452 -2.68301 
+1.4042 -2.14177 -2.326 
+1.23229 -2.3432 -2.3789 
+1.58739 -1.85834 -2.22784 
+1.58131 -1.22486 -2.74168 
+1.6744 -1.32182 -2.45974 
+1.49936 -1.14143 -2.99531 
+-3.72334 -2.5526 0.704516 
+-3.94688 -2.16178 0.17883 
+-3.53673 -2.86747 1.29157 
+-3.09697 -3.89856 1.31477 
+-3.25901 -3.52775 1.68394 
+-2.88671 -4.16149 1.00037 
+-3.05939 -3.57604 -0.219758 
+-2.83723 -3.96728 0.320476 
+-3.27318 -3.21934 -0.782109 
+1.33331 -2.9342 -1.61177 
+1.16881 -2.66371 -2.0397 
+1.5336 -3.23234 -1.20247 
+2.06797 -3.13773 -0.819062 
+1.88624 -3.34401 -0.880371 
+2.26006 -2.85334 -0.708133 
+1.92349 -2.16415 -1.35789 
+2.13334 -2.36132 -0.984854 
+1.80143 -1.89577 -1.71509 
+-2.79632 -3.7733 2.8834 
+-3.10006 -3.43554 2.58374 
+-2.44721 -4.02744 3.08826 
+-2.03339 -4.77114 2.27186 
+-2.04977 -4.54216 2.69246 
+-1.99788 -4.89846 1.92772 
+-2.26326 -4.78569 1.37027 
+-2.0897 -4.89792 1.58286 
+-2.45145 -4.58731 1.09442 
+1.96682 -3.83935 -0.416673 
+1.86659 -3.6842 -0.63955 
+2.02135 -3.93334 -0.235889 
+2.2961 -3.79686 0.0638899 
+2.13844 -3.91923 -0.0617669 
+2.48348 -3.59816 0.243014 
+2.73317 -2.98722 0.0337483 
+2.7531 -3.16993 0.269116 
+2.64841 -2.74929 -0.22545 
+-4.00132 0.747136 -6.73997 
+-3.94365 0.091219 -6.58249 
+-4.7589 0.949638 -5.07116 
+-4.63716 0.207867 -5.02673 
+0.902838 0.163255 -6.36273 
+0.735176 -0.306084 -6.26551 
+1.38809 0.162085 -5.19645 
+1.18599 -0.329481 -5.1542 
+-4.8867 0.802701 -2.10227 
+-4.7366 -0.0460991 -2.26113 
+1.86689 -0.00982394 -3.17871 
+1.60768 -0.569905 -3.23526 
+-4.65781 0.215503 -0.0785618 
+-4.53191 -0.53851 -0.369477 
+2.17864 -0.354214 -2.16885 
+1.9274 -0.861222 -2.25841 
+-3.24616 -2.05378 3.59533 
+-3.2411 -2.62948 3.00661 
+-3.32544 -1.39545 4.09076 
+-1.87122 -3.17058 4.55601 
+-1.76232 -2.59139 5.30166 
+-1.97101 -3.7355 3.82294 
+3.15771 -1.79974 0.175964 
+3.43642 -1.36605 0.291192 
+2.8645 -2.18348 -0.0653657 
+3.34775 -2.48698 1.12635 
+2.99035 -2.93103 0.796092 
+3.74268 -2.04801 1.41643 
+-3.15193 -1.67077 -6.18548 
+-2.86557 -1.65611 -6.19581 
+-3.37649 -1.65466 -6.154 
+-3.20491 -2.02014 -5.00787 
+-3.4876 -1.97062 -5.02349 
+-2.88094 -2.01632 -4.98489 
+-2.4823 -1.85623 -5.71401 
+-2.47157 -1.92462 -5.37337 
+-2.49119 -1.74955 -5.98554 
+-3.15132 -2.43013 -2.97535 
+-3.45726 -2.38931 -2.92782 
+-2.8029 -2.41332 -3.01701 
+-2.73734 -2.09086 -3.99532 
+-2.65186 -2.19665 -3.54724 
+-2.70508 -2.02369 -4.44913 
+-2.88969 -3.05411 -1.47937 
+-3.18708 -3.0316 -1.38927 
+-2.543 -3.02124 -1.55727 
+-2.28487 -2.63719 -2.3155 
+-2.22966 -2.76929 -2.00292 
+-2.32232 -2.50985 -2.63372 
+-2.0936 -4.34559 0.420928 
+-2.39668 -4.35998 0.579422 
+-1.73703 -4.27086 0.276391 
+-1.7944 -3.48795 -0.70639 
+-1.55713 -3.8478 -0.224744 
+-2.00082 -3.16732 -1.21007 
+-1.50208 -4.96317 1.54166 
+-1.78921 -4.96964 1.64381 
+-1.14512 -4.89167 1.4188 
+-1.00681 -4.5967 0.729272 
+-0.868979 -4.718 0.998826 
+-1.1641 -4.40993 0.455303 
+-1.55522 -1.50985 -6.13565 
+-1.028 -1.51658 -6.10814 
+-2.07683 -1.54669 -6.16664 
+-1.55686 -1.7958 -5.22173 
+-1.98428 -1.8475 -5.15583 
+-1.11395 -1.79736 -5.19305 
+-0.613512 -1.76054 -5.69179 
+-0.621845 -1.82359 -5.38182 
+-0.603178 -1.66776 -5.92453 
+-1.29793 -2.35062 -2.78105 
+-0.796534 -2.30814 -2.90381 
+-1.81822 -2.37913 -2.80095 
+-1.09204 -2.74609 -1.85447 
+-1.6565 -2.83862 -1.72989 
+-0.530025 -2.69451 -1.99838 
+-0.205135 -2.43593 -2.67093 
+-0.135298 -2.53705 -2.43088 
+-0.279876 -2.33338 -2.92824 
+-0.387685 -3.89185 -0.180316 
+-0.890217 -4.01732 -0.00527783 
+0.115873 -3.80435 -0.372881 
+0.236527 -3.15005 -1.32838 
+0.416465 -3.47766 -0.886709 
+0.0721572 -2.86367 -1.7796 
+0.195298 -4.47536 0.899516 
+-0.302864 -4.62283 1.11522 
+0.68462 -4.36154 0.65613 
+0.842625 -4.1445 -0.0312261 
+0.968835 -4.24619 0.196296 
+0.713 -3.98087 -0.272053 
+0.0082414 -1.5812 -6.03873 
+0.180699 -1.56679 -6.0053 
+-0.246729 -1.57742 -6.06503 
+0.0789296 -1.84488 -5.0836 
+-0.214903 -1.86596 -5.03965 
+0.29871 -1.79369 -5.11332 
+-0.241217 -1.93903 -4.15329 
+-0.347092 -1.88245 -4.55563 
+-0.232556 -2.03739 -3.7444 
+0.367577 -2.18227 -3.38331 
+0.0507734 -2.20539 -3.33772 
+0.609594 -2.12649 -3.41282 
+0.651451 -2.62153 -2.33036 
+0.340292 -2.65947 -2.2474 
+0.894836 -2.55683 -2.37943 
+1.26003 -3.65705 -0.808073 
+0.934456 -3.71271 -0.698122 
+1.52757 -3.57612 -0.87467 
+1.71951 -4.1396 0.0566446 
+1.43594 -4.21841 0.225961 
+1.92901 -4.04521 -0.0685248 
+-2.51699 -1.13389 -6.4822 
+-2.50788 -1.40775 -6.3483 
+-2.52391 -0.805664 -6.58785 
+-3.27567 -0.430012 -6.69684 
+-2.93869 -0.415956 -6.71276 
+-3.58341 -0.441408 -6.62437 
+-1.20862 -4.24219 3.15291 
+-1.61588 -4.26118 3.21558 
+-0.785379 -4.16248 3.02321 
+-0.532141 -4.58597 1.98823 
+-0.435947 -4.36136 2.375 
+-0.632874 -4.72572 1.62326 
+-2.49277 0.698738 -6.95948 
+-2.51871 0.0860778 -6.80089 
+0.0436423 -3.08602 3.99446 
+0.307231 -2.55053 4.63224 
+-0.174239 -3.61452 3.35507 
+-0.544956 -1.16239 -6.32232 
+-0.571672 -1.39222 -6.21273 
+-0.509343 -0.877315 -6.41071 
+-1.49035 -0.422138 -6.56896 
+-0.918673 -0.470779 -6.52161 
+-2.06337 -0.400254 -6.63206 
+0.748898 -3.75789 2.23389 
+0.178521 -3.89743 2.56753 
+1.30319 -3.65736 1.87614 
+1.39004 -4.10361 0.953076 
+1.54956 -3.8986 1.22816 
+1.24366 -4.23347 0.690681 
+-0.273554 0.42991 -6.71642 
+-0.386336 -0.0990521 -6.58674 
+2.3334 -2.72721 2.38661 
+2.69812 -2.25063 2.82898 
+2.00145 -3.20595 1.93568 
+0.193703 -0.630494 -6.40329 
+0.423709 -0.670141 -6.3206 
+-0.0912317 -0.583438 -6.45583 
+2.38491 -3.49704 0.994947 
+2.10849 -3.55114 1.26424 
+2.58896 -3.41772 0.733594 
+-1.98662 -1.18068 -4.40916 
+-2.2169 -1.6907 -4.64869 
+-1.8207 -0.430575 -4.24189 
+-1.36865 0.38085 -4.37504 
+-1.5403 0.399822 -4.31789 
+-1.16497 0.353136 -4.36594 
+-0.948075 -1.20194 -4.50592 
+-0.99051 -0.492778 -4.31994 
+-0.800062 -1.65842 -4.76712 
+-0.828951 -1.33822 -3.48738 
+-0.637894 -1.88484 -3.39235 
+-0.892334 -0.574546 -3.49476 
+-1.22235 0.302787 -3.24197 
+-1.05143 0.282402 -3.28105 
+-1.39249 0.325783 -3.26082 
+-1.87443 -1.31756 -3.41035 
+-1.72398 -0.514232 -3.42879 
+-2.07957 -1.91869 -3.28317 
+-1.81949 0.412331 -3.76738 
+-1.76417 0.393791 -3.57316 
+-1.80719 0.420136 -3.96548 
+-0.682726 0.263656 -3.84462 
+-0.735005 0.278567 -4.02531 
+-0.700094 0.255659 -3.66351 
+-3.89167 -1.26747 0.137509 
+-3.49728 -1.13278 0.30438 
+-4.13737 -1.38567 -0.0843891 
+-3.0309 -0.113912 0.551833 
+-3.02615 -0.459779 0.402987 
+-3.19423 -2.42301 1.99439 
+-3.32565 -2.74376 2.08911 
+-2.90842 -2.09428 1.85524 
+-2.32797 -1.22245 2.38612 
+-2.3637 -1.54761 2.11237 
+-2.33076 -0.858494 2.51966 
+-2.72393 -1.6907 0.857791 
+-2.83603 -1.44206 0.585443 
+-2.60057 -1.81551 1.20004 
+-1.54446 -0.817546 0.223352 
+-0.741512 -0.794006 -0.00267908 
+-2.28794 -0.88936 0.354886 
+0.173107 -0.298858 -0.263409 
+0.123547 -0.484843 -0.331724 
+-1.17794 -1.38231 1.14349 
+-1.86906 -1.55021 1.42735 
+-0.409478 -1.29076 0.81089 
+0.621322 -0.932474 0.811069 
+0.544826 -1.12411 0.6846 
+0.661719 -0.737652 0.858744 
+0.188974 -1.24932 -0.0428516 
+0.132004 -1.11559 -0.189905 
+0.271534 -1.31586 0.140549 
+1.46098 -1.12069 -1.26673 
+1.74203 -1.30177 -1.75764 
+0.871399 -0.944516 -0.754558 
+1.89776 -1.72361 -0.280191 
+1.21684 -1.42787 0.0436895 
+2.3262 -2.11095 -0.451812 
+-3.5006 -1.63187 -6.11414 
+-3.73313 -1.8628 -5.0341 
+-3.72584 -2.28491 -2.86942 
+-3.44379 -2.95021 -1.27892 
+-2.64375 -4.31279 0.753066 
+-1.96394 -4.93688 1.69971 
+-3.88162 -0.445805 -6.46897 
+-4.51178 -0.42362 -5.01406 
+-4.58717 -0.752656 -2.41224 
+-4.28752 -1.50381 -0.406651 
+-3.33118 -3.12838 2.14751 
+-2.03747 -4.20075 3.20415 
+-2.4989 -1.61258 -6.18646 
+-2.50785 -1.96965 -4.96444 
+-2.39295 -2.36812 -3.01734 
+-2.13851 -2.94275 -1.63549 
+-1.34891 -4.15677 0.143754 
+-0.747804 -4.77069 1.28119 
+-2.52615 -0.403147 -6.6871 
+-0.322503 -4.03888 2.82619 
+-0.59012 -1.55667 -6.08499 
+-0.585887 -1.85628 -5.03225 
+-0.322702 -2.22161 -3.22785 
+-0.0451405 -2.67609 -2.13577 
+0.569151 -3.75232 -0.555731 
+1.09768 -4.28433 0.425857 
+-0.459846 -0.52856 -6.49243 
+1.75062 -3.59755 1.55575 
+0.263583 -1.55256 -5.97393 
+0.453723 -1.71946 -5.13172 
+0.782866 -2.04544 -3.42524 
+1.07353 -2.47179 -2.3953 
+1.72124 -3.47893 -0.897421 
+2.03699 -3.96729 -0.137457 
+0.614838 -0.702134 -6.1938 
+1.0244 -0.76405 -5.14082 
+1.40668 -1.05174 -3.30423 
+1.75113 -1.48113 -2.16919 
+2.49429 -2.52456 -0.50212 
+2.71405 -3.30771 0.486464 
+-1.71259 0.418398 -4.1743 
+-1.61532 0.363077 -3.37354 
+-0.911944 0.315912 -4.24872 
+-0.815831 0.262372 -3.44385 
+-2.95053 -0.9992 0.383425 
+0.0901882 -0.831963 -0.325672 
+-2.45764 -1.7915 1.66513 
+0.408993 -1.29258 0.43342 
+4 0 3 2 1 
+4 0 5 4 3 
+4 0 7 6 5 
+4 0 1 8 7 
+4 9 12 11 10 
+4 9 14 13 12 
+4 9 16 15 14 
+4 9 10 17 16 
+4 18 21 20 19 
+4 18 23 22 21 
+4 18 25 24 23 
+4 18 19 26 25 
+4 27 30 29 28 
+4 27 32 31 30 
+4 27 34 33 32 
+4 27 28 35 34 
+4 36 39 38 37 
+4 36 41 40 39 
+4 36 43 42 41 
+4 36 37 44 43 
+4 45 48 47 46 
+4 45 50 49 48 
+4 45 52 51 50 
+4 45 46 53 52 
+4 54 57 56 55 
+4 54 59 58 57 
+4 54 61 60 59 
+4 54 55 62 61 
+4 63 66 65 64 
+4 63 68 67 66 
+4 63 70 69 68 
+4 63 64 71 70 
+4 72 75 74 73 
+4 72 77 76 75 
+4 72 79 78 77 
+4 72 73 80 79 
+4 81 84 83 82 
+4 81 86 85 84 
+4 81 88 87 86 
+4 81 82 89 88 
+4 90 93 92 91 
+4 90 95 94 93 
+4 96 99 98 97 
+4 96 101 100 99 
+4 102 105 104 103 
+4 102 107 106 105 
+4 108 111 110 109 
+4 108 113 112 111 
+4 114 117 116 115 
+4 114 119 118 117 
+4 120 123 122 121 
+4 120 125 124 123 
+4 126 129 128 127 
+4 126 131 130 129 
+4 126 133 132 131 
+4 126 127 134 133 
+4 135 138 137 136 
+4 135 140 139 138 
+4 135 142 141 140 
+4 135 136 143 142 
+4 144 147 146 145 
+4 144 149 148 147 
+4 144 151 150 149 
+4 144 145 152 151 
+4 153 156 155 154 
+4 153 158 157 156 
+4 153 160 159 158 
+4 153 154 161 160 
+4 162 165 164 163 
+4 162 167 166 165 
+4 162 169 168 167 
+4 162 163 170 169 
+4 171 174 173 172 
+4 171 176 175 174 
+4 171 178 177 176 
+4 171 172 179 178 
+4 180 183 182 181 
+4 180 185 184 183 
+4 180 187 186 185 
+4 180 181 188 187 
+4 189 192 191 190 
+4 189 194 193 192 
+4 189 196 195 194 
+4 189 190 197 196 
+4 198 201 200 199 
+4 198 203 202 201 
+4 198 205 204 203 
+4 198 199 206 205 
+4 207 210 209 208 
+4 207 212 211 210 
+4 207 214 213 212 
+4 207 208 215 214 
+4 216 219 218 217 
+4 216 221 220 219 
+4 216 223 222 221 
+4 216 217 224 223 
+4 225 228 227 226 
+4 225 230 229 228 
+4 225 232 231 230 
+4 225 226 233 232 
+4 234 237 236 235 
+4 234 239 238 237 
+4 234 241 240 239 
+4 234 235 242 241 
+4 243 246 245 244 
+4 243 248 247 246 
+4 243 250 249 248 
+4 243 244 251 250 
+4 252 255 254 253 
+4 252 257 256 255 
+4 252 259 258 257 
+4 252 253 260 259 
+4 261 264 263 262 
+4 261 266 265 264 
+4 261 268 267 266 
+4 261 262 269 268 
+4 270 273 272 271 
+4 270 275 274 273 
+4 270 277 276 275 
+4 270 271 278 277 
+4 279 282 281 280 
+4 279 284 283 282 
+4 279 286 285 284 
+4 279 280 287 286 
+4 288 291 290 289 
+4 288 289 293 292 
+4 294 297 296 295 
+4 294 299 298 297 
+4 294 301 300 299 
+4 294 295 302 301 
+4 303 306 305 304 
+4 303 308 307 306 
+4 303 310 309 308 
+4 303 304 311 310 
+4 312 315 314 313 
+4 312 317 316 315 
+4 312 319 318 317 
+4 312 313 320 319 
+4 321 324 323 322 
+4 321 322 326 325 
+4 327 330 329 328 
+4 327 332 331 330 
+4 327 334 333 332 
+4 327 328 335 334 
+4 336 339 338 337 
+4 336 341 340 339 
+4 336 343 342 341 
+4 336 337 344 343 
+4 345 348 347 346 
+4 345 350 349 348 
+4 345 352 351 350 
+4 345 346 353 352 
+4 354 357 356 355 
+4 354 355 359 358 
+4 360 363 362 361 
+4 360 365 364 363 
+4 360 367 366 365 
+4 360 361 368 367 
+4 369 372 371 370 
+4 369 374 373 372 
+4 369 376 375 374 
+4 369 370 377 376 
+4 378 381 380 379 
+4 378 383 382 381 
+4 378 385 384 383 
+4 378 379 386 385 
+4 387 390 389 388 
+4 387 392 391 390 
+4 387 394 393 392 
+4 387 388 395 394 
+4 396 399 398 397 
+4 396 401 400 399 
+4 396 403 402 401 
+4 396 397 404 403 
+4 405 408 407 406 
+4 405 406 410 409 
+4 411 414 413 412 
+4 411 416 415 414 
+4 411 418 417 416 
+4 411 412 419 418 
+4 420 423 422 421 
+4 420 425 424 423 
+4 420 427 426 425 
+4 420 421 428 427 
+4 429 432 431 430 
+4 429 430 434 433 
+4 435 438 437 436 
+4 435 440 439 438 
+4 435 442 441 440 
+4 435 436 443 442 
+4 444 447 446 445 
+4 444 449 448 447 
+4 444 451 450 449 
+4 444 445 452 451 
+4 453 456 455 454 
+4 453 454 458 457 
+4 459 462 461 460 
+4 459 464 463 462 
+4 459 466 465 464 
+4 459 460 467 466 
+4 468 471 470 469 
+4 468 473 472 471 
+4 468 475 474 473 
+4 468 469 476 475 
+4 477 478 8 1 
+4 477 277 278 478 
+4 477 479 276 277 
+4 477 1 2 479 
+4 480 481 2 3 
+4 480 93 94 481 
+4 480 482 92 93 
+4 480 3 4 482 
+4 483 484 4 5 
+4 483 19 20 484 
+4 483 485 26 19 
+4 483 5 6 485 
+4 486 487 6 7 
+4 486 147 148 487 
+4 486 488 146 147 
+4 486 7 8 488 
+4 489 490 17 10 
+4 489 339 340 490 
+4 489 491 338 339 
+4 489 10 11 491 
+4 492 493 11 12 
+4 492 232 233 493 
+4 492 494 231 232 
+4 492 12 13 494 
+4 495 496 13 14 
+4 495 28 29 496 
+4 495 497 35 28 
+4 495 14 15 497 
+4 498 499 15 16 
+4 498 99 100 499 
+4 498 500 98 99 
+4 498 16 17 500 
+4 501 502 20 21 
+4 501 105 106 502 
+4 501 503 104 105 
+4 501 21 22 503 
+4 504 505 22 23 
+4 504 37 38 505 
+4 504 506 44 37 
+4 504 23 24 506 
+4 507 508 24 25 
+4 507 156 157 508 
+4 507 509 155 156 
+4 507 25 26 509 
+4 510 511 29 30 
+4 510 241 242 511 
+4 510 512 240 241 
+4 510 30 31 512 
+4 513 514 31 32 
+4 513 46 47 514 
+4 513 515 53 46 
+4 513 32 33 515 
+4 516 517 33 34 
+4 516 111 112 517 
+4 516 518 110 111 
+4 516 34 35 518 
+4 519 520 38 39 
+4 519 117 118 520 
+4 519 521 116 117 
+4 519 39 40 521 
+4 522 523 40 41 
+4 522 55 56 523 
+4 522 524 62 55 
+4 522 41 42 524 
+4 525 526 42 43 
+4 525 165 166 526 
+4 525 527 164 165 
+4 525 43 44 527 
+4 528 529 47 48 
+4 528 250 251 529 
+4 528 530 249 250 
+4 528 48 49 530 
+4 531 532 49 50 
+4 531 64 65 532 
+4 531 533 71 64 
+4 531 50 51 533 
+4 534 535 51 52 
+4 534 123 124 535 
+4 534 536 122 123 
+4 534 52 53 536 
+4 537 538 56 57 
+4 537 427 428 538 
+4 537 539 426 427 
+4 537 57 58 539 
+4 540 541 58 59 
+4 540 73 74 541 
+4 540 542 80 73 
+4 540 59 60 542 
+4 543 544 60 61 
+4 543 174 175 544 
+4 543 545 173 174 
+4 543 61 62 545 
+4 546 547 65 66 
+4 546 259 260 547 
+4 546 548 258 259 
+4 546 66 67 548 
+4 549 550 67 68 
+4 549 82 83 550 
+4 549 551 89 82 
+4 549 68 69 551 
+4 552 553 69 70 
+4 552 471 472 553 
+4 552 554 470 471 
+4 552 70 71 554 
+4 555 556 74 75 
+4 555 133 134 556 
+4 555 557 132 133 
+4 555 75 76 557 
+4 558 559 76 77 
+4 558 282 283 559 
+4 558 560 281 282 
+4 558 77 78 560 
+4 561 562 78 79 
+4 561 183 184 562 
+4 561 563 182 183 
+4 561 79 80 563 
+4 564 565 83 84 
+4 564 268 269 565 
+4 564 566 267 268 
+4 564 84 85 566 
+4 567 568 85 86 
+4 567 352 353 568 
+4 567 569 351 352 
+4 567 86 87 569 
+4 570 571 87 88 
+4 570 138 139 571 
+4 570 572 137 138 
+4 570 88 89 572 
+4 573 574 94 95 
+4 573 292 293 574 
+4 575 576 106 107 
+4 575 91 92 576 
+4 577 578 356 357 
+4 577 97 98 578 
+4 579 580 100 101 
+4 579 109 110 580 
+4 581 582 118 119 
+4 581 103 104 582 
+4 583 584 112 113 
+4 583 121 122 584 
+4 585 586 407 408 
+4 585 115 116 586 
+4 587 588 124 125 
+4 587 457 458 588 
+4 589 590 134 127 
+4 589 418 419 590 
+4 589 591 417 418 
+4 589 127 128 591 
+4 592 593 130 131 
+4 592 297 298 593 
+4 592 594 296 297 
+4 592 131 132 594 
+4 595 596 143 136 
+4 595 462 463 596 
+4 595 597 461 462 
+4 595 136 137 597 
+4 598 599 139 140 
+4 598 367 368 599 
+4 598 600 366 367 
+4 598 140 141 600 
+4 601 602 152 145 
+4 601 271 272 602 
+4 601 603 278 271 
+4 601 145 146 603 
+4 604 605 148 149 
+4 604 154 155 605 
+4 604 606 161 154 
+4 604 149 150 606 
+4 607 608 150 151 
+4 607 192 193 608 
+4 607 609 191 192 
+4 607 151 152 609 
+4 610 611 157 158 
+4 610 163 164 611 
+4 610 612 170 163 
+4 610 158 159 612 
+4 613 614 159 160 
+4 613 390 391 614 
+4 613 615 389 390 
+4 613 160 161 615 
+4 616 617 166 167 
+4 616 172 173 617 
+4 616 618 179 172 
+4 616 167 168 618 
+4 619 620 168 169 
+4 619 201 202 620 
+4 619 621 200 201 
+4 619 169 170 621 
+4 622 623 175 176 
+4 622 181 182 623 
+4 622 624 188 181 
+4 622 176 177 624 
+4 625 626 177 178 
+4 625 210 211 626 
+4 625 627 209 210 
+4 625 178 179 627 
+4 628 629 184 185 
+4 628 280 281 629 
+4 628 630 287 280 
+4 628 185 186 630 
+4 631 632 186 187 
+4 631 219 220 632 
+4 631 633 218 219 
+4 631 187 188 633 
+4 634 635 197 190 
+4 634 304 305 635 
+4 634 636 311 304 
+4 634 190 191 636 
+4 637 638 193 194 
+4 637 370 371 638 
+4 637 639 377 370 
+4 637 194 195 639 
+4 640 641 195 196 
+4 640 228 229 641 
+4 640 642 227 228 
+4 640 196 197 642 
+4 643 644 206 199 
+4 643 379 380 644 
+4 643 645 386 379 
+4 643 199 200 645 
+4 646 647 202 203 
+4 646 208 209 647 
+4 646 648 215 208 
+4 646 203 204 648 
+4 649 650 204 205 
+4 649 246 247 650 
+4 649 651 245 246 
+4 649 205 206 651 
+4 652 653 211 212 
+4 652 217 218 653 
+4 652 654 224 217 
+4 652 212 213 654 
+4 655 656 213 214 
+4 655 255 256 656 
+4 655 657 254 255 
+4 655 214 215 657 
+4 658 659 220 221 
+4 658 313 314 659 
+4 658 660 320 313 
+4 658 221 222 660 
+4 661 662 222 223 
+4 661 264 265 662 
+4 661 663 263 264 
+4 661 223 224 663 
+4 664 665 233 226 
+4 664 337 338 665 
+4 664 666 344 337 
+4 664 226 227 666 
+4 667 668 229 230 
+4 667 235 236 668 
+4 667 669 242 235 
+4 667 230 231 669 
+4 670 671 236 237 
+4 670 403 404 671 
+4 670 672 402 403 
+4 670 237 238 672 
+4 673 674 238 239 
+4 673 244 245 674 
+4 673 675 251 244 
+4 673 239 240 675 
+4 676 677 247 248 
+4 676 253 254 677 
+4 676 678 260 253 
+4 676 248 249 678 
+4 679 680 256 257 
+4 679 262 263 680 
+4 679 681 269 262 
+4 679 257 258 681 
+4 682 683 265 266 
+4 682 346 347 683 
+4 682 684 353 346 
+4 682 266 267 684 
+4 685 686 272 273 
+4 685 310 311 686 
+4 685 687 309 310 
+4 685 273 274 687 
+4 688 689 274 275 
+4 688 289 290 689 
+4 688 690 293 289 
+4 688 275 276 690 
+4 691 692 283 284 
+4 691 295 296 692 
+4 691 693 302 295 
+4 691 284 285 693 
+4 694 695 285 286 
+4 694 315 316 695 
+4 694 696 314 315 
+4 694 286 287 696 
+4 697 698 290 291 
+4 697 325 326 698 
+4 699 700 300 301 
+4 699 330 331 700 
+4 699 701 329 330 
+4 699 301 302 701 
+4 702 703 305 306 
+4 702 343 344 703 
+4 702 704 342 343 
+4 702 306 307 704 
+4 705 706 307 308 
+4 705 322 323 706 
+4 705 707 326 322 
+4 705 308 309 707 
+4 708 709 316 317 
+4 708 328 329 709 
+4 708 710 335 328 
+4 708 317 318 710 
+4 711 712 318 319 
+4 711 348 349 712 
+4 711 713 347 348 
+4 711 319 320 713 
+4 714 715 323 324 
+4 714 358 359 715 
+4 716 717 333 334 
+4 716 363 364 717 
+4 716 718 362 363 
+4 716 334 335 718 
+4 719 720 340 341 
+4 719 355 356 720 
+4 719 721 359 355 
+4 719 341 342 721 
+4 722 723 349 350 
+4 722 361 362 723 
+4 722 724 368 361 
+4 722 350 351 724 
+4 725 726 371 372 
+4 725 388 389 726 
+4 725 727 395 388 
+4 725 372 373 727 
+4 728 729 373 374 
+4 728 374 375 730 
+4 731 732 375 376 
+4 731 397 398 732 
+4 731 733 404 397 
+4 731 376 377 733 
+4 734 735 380 381 
+4 734 401 402 735 
+4 734 736 400 401 
+4 734 381 382 736 
+4 737 738 382 383 
+4 737 383 384 739 
+4 740 741 384 385 
+4 740 392 393 741 
+4 740 742 391 392 
+4 740 385 386 742 
+4 743 744 393 394 
+4 743 394 395 745 
+4 746 747 398 399 
+4 746 399 400 748 
+4 749 750 410 406 
+4 749 421 422 750 
+4 749 751 428 421 
+4 749 406 407 751 
+4 752 753 431 432 
+4 752 409 410 753 
+4 754 755 419 412 
+4 754 425 426 755 
+4 754 756 424 425 
+4 754 412 413 756 
+4 757 758 413 414 
+4 757 442 443 758 
+4 757 759 441 442 
+4 757 414 415 759 
+4 760 761 422 423 
+4 760 451 452 761 
+4 760 762 450 451 
+4 760 423 424 762 
+4 763 764 434 430 
+4 763 445 446 764 
+4 763 765 452 445 
+4 763 430 431 765 
+4 766 767 455 456 
+4 766 433 434 767 
+4 768 769 443 436 
+4 768 449 450 769 
+4 768 770 448 449 
+4 768 436 437 770 
+4 771 772 437 438 
+4 771 466 467 772 
+4 771 773 465 466 
+4 771 438 439 773 
+4 774 775 446 447 
+4 774 475 476 775 
+4 774 776 474 475 
+4 774 447 448 776 
+4 777 778 458 454 
+4 777 469 470 778 
+4 777 779 476 469 
+4 777 454 455 779 
+4 780 781 467 460 
+4 780 473 474 781 
+4 780 782 472 473 
+4 780 460 461 782 
+4 783 488 8 478 
+4 783 603 146 488 
+4 783 478 278 603 
+4 784 487 148 605 
+4 784 485 6 487 
+4 784 509 26 485 
+4 784 605 155 509 
+4 785 508 157 611 
+4 785 506 24 508 
+4 785 527 44 506 
+4 785 611 164 527 
+4 786 526 166 617 
+4 786 524 42 526 
+4 786 545 62 524 
+4 786 617 173 545 
+4 787 544 175 623 
+4 787 542 60 544 
+4 787 563 80 542 
+4 787 623 182 563 
+4 788 562 184 629 
+4 788 560 78 562 
+4 788 629 281 560 
+4 789 481 94 574 
+4 789 479 2 481 
+4 789 690 276 479 
+4 789 574 293 690 
+4 790 484 20 502 
+4 790 482 4 484 
+4 790 576 92 482 
+4 790 502 106 576 
+4 791 505 38 520 
+4 791 503 22 505 
+4 791 582 104 503 
+4 791 520 118 582 
+4 792 523 56 538 
+4 792 521 40 523 
+4 792 586 116 521 
+4 792 751 407 586 
+4 792 538 428 751 
+4 793 590 419 755 
+4 793 556 134 590 
+4 793 541 74 556 
+4 793 539 58 541 
+4 793 755 426 539 
+4 794 559 283 692 
+4 794 557 76 559 
+4 794 594 132 557 
+4 794 692 296 594 
+4 795 602 272 686 
+4 795 609 152 602 
+4 795 636 191 609 
+4 795 686 311 636 
+4 796 638 371 726 
+4 796 608 193 638 
+4 796 606 150 608 
+4 796 615 161 606 
+4 796 726 389 615 
+4 797 612 159 614 
+4 797 621 170 612 
+4 797 645 200 621 
+4 797 742 386 645 
+4 797 614 391 742 
+4 798 620 202 647 
+4 798 618 168 620 
+4 798 627 179 618 
+4 798 647 209 627 
+4 799 626 211 653 
+4 799 624 177 626 
+4 799 633 188 624 
+4 799 653 218 633 
+4 800 632 220 659 
+4 800 630 186 632 
+4 800 696 287 630 
+4 800 659 314 696 
+4 801 689 290 698 
+4 801 687 274 689 
+4 801 707 309 687 
+4 801 698 326 707 
+4 802 695 316 709 
+4 802 693 285 695 
+4 802 701 302 693 
+4 802 709 329 701 
+4 803 635 305 703 
+4 803 642 197 635 
+4 803 666 227 642 
+4 803 703 344 666 
+4 804 668 236 671 
+4 804 641 229 668 
+4 804 639 195 641 
+4 804 733 377 639 
+4 804 671 404 733 
+4 805 644 380 735 
+4 805 651 206 644 
+4 805 674 245 651 
+4 805 672 238 674 
+4 805 735 402 672 
+4 806 650 247 677 
+4 806 648 204 650 
+4 806 657 215 648 
+4 806 677 254 657 
+4 807 656 256 680 
+4 807 654 213 656 
+4 807 663 224 654 
+4 807 680 263 663 
+4 808 662 265 683 
+4 808 660 222 662 
+4 808 713 320 660 
+4 808 683 347 713 
+4 809 706 323 715 
+4 809 704 307 706 
+4 809 721 342 704 
+4 809 715 359 721 
+4 810 712 349 723 
+4 810 710 318 712 
+4 810 718 335 710 
+4 810 723 362 718 
+4 811 493 233 665 
+4 811 491 11 493 
+4 811 665 338 491 
+4 812 496 29 511 
+4 812 494 13 496 
+4 812 669 231 494 
+4 812 511 242 669 
+4 813 514 47 529 
+4 813 512 31 514 
+4 813 675 240 512 
+4 813 529 251 675 
+4 814 532 65 547 
+4 814 530 49 532 
+4 814 678 249 530 
+4 814 547 260 678 
+4 815 550 83 565 
+4 815 548 67 550 
+4 815 681 258 548 
+4 815 565 269 681 
+4 816 566 85 568 
+4 816 684 267 566 
+4 816 568 353 684 
+4 817 490 340 720 
+4 817 500 17 490 
+4 817 578 98 500 
+4 817 720 356 578 
+4 818 499 100 580 
+4 818 497 15 499 
+4 818 518 35 497 
+4 818 580 110 518 
+4 819 517 112 584 
+4 819 515 33 517 
+4 819 536 53 515 
+4 819 584 122 536 
+4 820 588 458 778 
+4 820 535 124 588 
+4 820 533 51 535 
+4 820 554 71 533 
+4 820 778 470 554 
+4 821 551 69 553 
+4 821 572 89 551 
+4 821 597 137 572 
+4 821 782 461 597 
+4 821 553 472 782 
+4 822 571 139 599 
+4 822 569 87 571 
+4 822 724 351 569 
+4 822 599 368 724 
+4 823 727 373 729 
+4 823 745 395 727 
+4 824 741 393 744 
+4 824 739 384 741 
+4 825 732 398 747 
+4 825 730 375 732 
+4 826 736 382 738 
+4 826 748 400 736 
+4 827 750 422 761 
+4 827 753 410 750 
+4 827 765 431 753 
+4 827 761 452 765 
+4 828 764 446 775 
+4 828 767 434 764 
+4 828 779 455 767 
+4 828 775 476 779 
+4 829 758 443 769 
+4 829 756 413 758 
+4 829 762 424 756 
+4 829 769 450 762 
+4 830 772 467 781 
+4 830 770 437 772 
+4 830 776 448 770 
+4 830 781 474 776 

+ 1 - 0
tutorial/shared/intersection_quads.off.REMOVED.git-id

@@ -0,0 +1 @@
+5413a91923d24198f4b8212185bd59a70c02a5db

+ 1 - 1
tutorial/tutorial.html.REMOVED.git-id

@@ -1 +1 @@
-b343733b8952ee7d369f3d9d545df7b287feaf9a
+25459975e136159f61ba5a0b623fb53c2e010800

+ 1 - 1
tutorial/tutorial.md.REMOVED.git-id

@@ -1 +1 @@
-c1909d8cc23f365861fbee1d5e34c5f9a4d874ae
+265ab5bbee379703846959c91d8133e023079dcf