#ifndef FLATPATTERNGEOMETRY_HPP #define FLATPATTERNGEOMETRY_HPP #include "edgemesh.hpp" #include #include #include class FlatPatternGeometry : public VCGEdgeMesh { private: size_t computeTiledValence(const size_t &nodeIndex, const std::vector &numberOfNodesPerSlot) const; size_t getNodeValence(const size_t &nodeIndex) const; size_t getNodeSlot(const size_t &nodeIndex) const; const size_t fanSize{6}; std::vector vertices; const double triangleEdgeSize{1}; // radius edge std::unordered_map nodeSlot; std::unordered_map correspondingNode; std::unordered_map nodeTiledValence; void constructCorresponginNodeMap(const std::vector &numberOfNodesPerSlot); void constructNodeToTiledValenceMap( const std::vector &numberOfNodesPerSlot); public: FlatPatternGeometry(); /*The following function should be a copy constructor with * a const argument but this is impossible due to the * vcglib interface. * */ FlatPatternGeometry(FlatPatternGeometry &other); bool savePly(const std::string plyFilename); void add(const std::vector &vertices); void add(const std::vector &edges); void add(const std::vector &vertices, const std::vector &edges); void add(const std::vector &numberOfNodesPerSlot, const std::vector &edges); static std::vector constructVertexVector(const std::vector &numberOfNodesPerSlot, const size_t &fanSize, const double &triangleEdgeSize); bool hasDanglingEdges(const std::vector &numberOfNodesPerSlot); std::vector getVertices() const; static FlatPatternGeometry createFan(FlatPatternGeometry &pattern); static FlatPatternGeometry createTile(FlatPatternGeometry &pattern); double getTriangleEdgeSize() const; bool hasUntiledDanglingEdges(); std::unordered_map> getIntersectingEdges(size_t &numberOfIntersectingEdgePairs) const; static size_t binomialCoefficient(size_t n, size_t m) { assert(n >= m); return tgamma(n + 1) / (tgamma(m + 1) * tgamma(n - m + 1)); } bool isFullyConnectedWhenTiled(); bool hasIntersectingEdges( const std::string &patternBinaryRepresentation, const std::unordered_map> &intersectingEdges); bool isPatternValid(); size_t getFanSize() const; }; #endif // FLATPATTERNGEOMETRY_HPP