#ifndef TYPES_H #define TYPES_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define USE_FLOAT_SCALAR #define SAME_THRESHOLD 1e-6 #ifdef USE_FLOAT_SCALAR typedef float Scalar; #else typedef double Scalar; #endif typedef Eigen::SparseMatrix ColMajorSparseMatrix; typedef Eigen::SparseMatrix RowMajorSparseMatrix; #ifdef EIGEN_DONT_ALIGN #define EIGEN_ALIGNMENT Eigen::DontAlign #else #define EIGEN_ALIGNMENT Eigen::AutoAlign #endif typedef Eigen::Triplet Triplet; // ====================================================== // 基础模板别名 // ====================================================== template using MatrixT = Eigen::Matrix; // ====================== // 向量类型 // ====================== using Vector2 = MatrixT<2,1>; using Vector3 = MatrixT<3,1>; using Vector4 = MatrixT<4,1>; using Vector6 = MatrixT<6,1>; using VectorX = MatrixT; using VectorN = Vector3; // 别名(等价于 Vector3) // ====================== // 固定尺寸矩阵 // ====================== using Matrix22 = MatrixT<2,2>; using Matrix23 = MatrixT<2,3>; using Matrix32 = MatrixT<3,2>; using Matrix33 = MatrixT<3,3>; using Matrix34 = MatrixT<3,4>; using Matrix44 = MatrixT<4,4>; using Matrix66 = MatrixT<6,6>; using EigenMatrix12 = MatrixT<12,12>; // ====================== // 动态尺寸矩阵 // ====================== using Matrix2X = MatrixT<2,Eigen::Dynamic>; using Matrix3X = MatrixT<3,Eigen::Dynamic>; using Matrix4X = MatrixT<4,Eigen::Dynamic>; using MatrixX2 = MatrixT; using MatrixX3 = MatrixT; using MatrixXX = MatrixT; using Vertices = Matrix3X; // 顶点矩阵,3×N // ====================== // 特殊变换与几何类型 // ====================== using Affine3 = Eigen::Transform; using Affine3d = Affine3; // 同义,方便兼容 using AffineMatrix3 = Matrix44; // 4×4 变换矩阵 using EigenAngleAxis = Eigen::AngleAxis; using EigenQuaternion = Eigen::Quaternion; // ====================== // 块类型 // ====================== using Block33 = Eigen::Block; // Conversion between a 3d vector type to Eigen::Vector3d template inline Vector3 to_eigen_vec3(const Vec_T &vec) { return Vector3(vec[0], vec[1], vec[2]); } template inline Vec_T from_eigen_vec3(const Vector3 &vec) { Vec_T v; v[0] = vec(0); v[1] = vec(1); v[2] = vec(2); return v; } enum VertexState { OUTSIDE, FRONT, INSIDE }; struct TriTraits : public OpenMesh::DefaultTraits { #ifdef USE_FLOAT_SCALAR typedef OpenMesh::Vec3f Point; typedef OpenMesh::Vec3f Normal; #else typedef OpenMesh::Vec3d Point; typedef OpenMesh::Vec3d Normal; #endif typedef OpenMesh::Vec4f Color; VertexAttributes(OpenMesh::Attributes::Status); FaceAttributes(OpenMesh::Attributes::Status); EdgeAttributes(OpenMesh::Attributes::Status); HalfedgeAttributes(OpenMesh::Attributes::Status); VertexTraits { VertexT() : geodesic_distance(1e100), state(OUTSIDE),incident_point(0.0), saddle_or_boundary(false) {}; public: Scalar geodesic_distance; VertexState state; OpenMesh::FaceHandle incident_face; Scalar incident_point; bool saddle_or_boundary; }; FaceTraits { FaceT() : corner_angles(0,0,0) {}; public: Vector3 corner_angles; }; EdgeTraits { EdgeT() : length(0.0) {}; public: Scalar length; }; }; typedef OpenMesh::TriMesh_ArrayKernelT Mesh; #ifdef USE_FLOAT_SCALAR typedef OpenMesh::Vec3f Vec3; #else typedef OpenMesh::Vec3d Vec3; #endif class Matrix3333 // 3x3 matrix: each element is a 3x3 matrix { public: Matrix3333(); Matrix3333(const Matrix3333& other); ~Matrix3333() {} void SetZero(); // [0 0 0; 0 0 0; 0 0 0]; 0 = 3x3 zeros void SetIdentity(); //[I 0 0; 0 I 0; 0 0 I]; 0 = 3x3 zeros, I = 3x3 identity // operators Matrix33& operator() (int row, int col); Matrix3333 operator+ (const Matrix3333& plus); Matrix3333 operator- (const Matrix3333& minus); Matrix3333 operator* (const Matrix33& multi); friend Matrix3333 operator* (const Matrix33& multi1, Matrix3333& multi2); Matrix3333 operator* (Scalar multi); friend Matrix3333 operator* (Scalar multi1, Matrix3333& multi2); Matrix3333 transpose(); Matrix33 Contract(const Matrix33& multi); // this operator is commutative Matrix3333 Contract(Matrix3333& multi); //protected: Matrix33 mat[3][3]; }; class Matrix2222 // 2x2 matrix: each element is a 2x2 matrix { public: Matrix2222(); Matrix2222(const Matrix2222& other); ~Matrix2222() {} void SetZero(); // [0 0; 0 0]; 0 = 2x2 zeros void SetIdentity(); //[I 0; 0 I;]; 0 = 2x2 zeros, I = 2x2 identity // operators and basic functions Matrix22& operator() (int row, int col); Matrix2222 operator+ (const Matrix2222& plus); Matrix2222 operator- (const Matrix2222& minus); Matrix2222 operator* (const Matrix22& multi); friend Matrix2222 operator* (const Matrix22& multi1, Matrix2222& multi2); Matrix2222 operator* (Scalar multi); friend Matrix2222 operator* (Scalar multi1, Matrix2222& multi2); Matrix2222 transpose(); Matrix22 Contract(const Matrix22& multi); // this operator is commutative Matrix2222 Contract(Matrix2222& multi); protected: Matrix22 mat[2][2]; }; // dst = src1 \kron src2 void directProduct(Matrix3333& dst, const Matrix33& src1, const Matrix33& src2); void directProduct(Matrix2222& dst, const Matrix22& src1, const Matrix22& src2); #endif // TYPES_H ///////////////////////////////////////////////////////////////////////////////