2020-11-27 11:47:21 +01:00
|
|
|
#ifndef FLATPATTERNGEOMETRY_HPP
|
|
|
|
#define FLATPATTERNGEOMETRY_HPP
|
|
|
|
#include <string>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <unordered_set>
|
2022-09-14 13:04:05 +02:00
|
|
|
#include "edgemesh.hpp"
|
2021-03-15 18:04:29 +01:00
|
|
|
#include "polymesh.hpp"
|
2022-09-14 13:04:05 +02:00
|
|
|
#include "vcgtrimesh.hpp"
|
2020-11-27 11:47:21 +01:00
|
|
|
|
2021-04-30 12:13:58 +02:00
|
|
|
class PatternGeometry;
|
|
|
|
using ConstPatternGeometry = PatternGeometry;
|
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
class PatternGeometry : public VCGEdgeMesh {
|
|
|
|
private:
|
|
|
|
size_t computeTiledValence(
|
|
|
|
const size_t& nodeIndex,
|
|
|
|
const std::vector<size_t>& numberOfNodesPerSlot) const;
|
|
|
|
size_t getNodeValence(const size_t& nodeIndex) const;
|
|
|
|
size_t getNodeSlot(const size_t& nodeIndex) const;
|
2020-11-27 11:47:21 +01:00
|
|
|
|
2021-03-15 18:04:29 +01:00
|
|
|
void addNormals();
|
|
|
|
double baseTriangleHeight;
|
|
|
|
|
2021-04-30 12:13:58 +02:00
|
|
|
inline static size_t fanSize{6};
|
2020-11-27 11:47:21 +01:00
|
|
|
std::vector<VCGEdgeMesh::CoordType> vertices;
|
2022-09-14 13:04:05 +02:00
|
|
|
const double triangleEdgeSize{1}; // radius edge
|
2021-04-30 12:13:58 +02:00
|
|
|
std::unordered_map<size_t, size_t> nodeToSlotMap;
|
2020-11-27 11:47:21 +01:00
|
|
|
std::unordered_map<size_t, size_t> correspondingNode;
|
|
|
|
std::unordered_map<size_t, size_t> nodeTiledValence;
|
2021-04-30 12:13:58 +02:00
|
|
|
vcg::Triangle3<double> baseTriangle;
|
2020-11-27 11:47:21 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
void constructCorrespondingNodeMap(
|
|
|
|
const std::vector<size_t>& numberOfNodesPerSlot);
|
2021-04-30 12:13:58 +02:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
void constructNodeToTiledValenceMap(
|
|
|
|
const std::vector<size_t>& numberOfNodesPerSlot);
|
2020-11-27 11:47:21 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
std::vector<VectorType> getEdgeVectorsWithVertexAsOrigin(
|
|
|
|
std::vector<EdgePointer>& edgePointers,
|
|
|
|
const int& vi);
|
2020-11-27 11:47:21 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
public:
|
2022-01-28 19:01:44 +01:00
|
|
|
inline static VectorType DefaultNormal{0.0, 0.0, 1.0};
|
2021-03-15 18:04:29 +01:00
|
|
|
PatternGeometry();
|
2020-11-27 11:47:21 +01:00
|
|
|
/*The following function should be a copy constructor with
|
|
|
|
* a const argument but this is impossible due to the
|
|
|
|
* vcglib interface.
|
|
|
|
* */
|
2022-09-14 13:04:05 +02:00
|
|
|
PatternGeometry(PatternGeometry& other);
|
|
|
|
bool load(const std::filesystem::path& meshFilePath) override;
|
|
|
|
void add(const std::vector<vcg::Point3d>& vertices);
|
|
|
|
void add(const std::vector<vcg::Point2i>& edges);
|
|
|
|
void add(const std::vector<vcg::Point3d>& vertices,
|
|
|
|
const std::vector<vcg::Point2i>& edges);
|
|
|
|
void add(const std::vector<size_t>& numberOfNodesPerSlot,
|
|
|
|
const std::vector<vcg::Point2i>& edges);
|
2022-01-28 19:01:44 +01:00
|
|
|
static std::vector<vcg::Point3d> constructVertexVector(
|
2022-09-14 13:04:05 +02:00
|
|
|
const std::vector<size_t>& numberOfNodesPerSlot,
|
|
|
|
const size_t& fanSize,
|
|
|
|
const double& triangleEdgeSize);
|
|
|
|
bool hasDanglingEdges(const std::vector<size_t>& numberOfNodesPerSlot);
|
|
|
|
bool hasValenceGreaterThan(const std::vector<size_t>& numberOfNodesPerSlot,
|
|
|
|
const size_t& valenceThreshold);
|
2022-02-18 16:44:33 +01:00
|
|
|
std::vector<vcg::Point3d> computeVertices() const;
|
2022-09-14 13:04:05 +02:00
|
|
|
static PatternGeometry createFan(PatternGeometry& pattern);
|
|
|
|
static PatternGeometry createTile(PatternGeometry& pattern);
|
2020-11-27 11:47:21 +01:00
|
|
|
double getTriangleEdgeSize() const;
|
|
|
|
bool hasUntiledDanglingEdges();
|
2022-01-28 19:01:44 +01:00
|
|
|
std::unordered_map<size_t, std::unordered_set<size_t>> getIntersectingEdges(
|
2022-09-14 13:04:05 +02:00
|
|
|
size_t& numberOfIntersectingEdgePairs) const;
|
2020-11-27 11:47:21 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
static size_t binomialCoefficient(size_t n, size_t m) {
|
|
|
|
assert(n >= m);
|
|
|
|
return tgamma(n + 1) / (tgamma(m + 1) * tgamma(n - m + 1));
|
2020-11-27 11:47:21 +01:00
|
|
|
}
|
2021-11-15 10:08:39 +01:00
|
|
|
bool isFullyConnectedWhenFanned();
|
2020-11-27 11:47:21 +01:00
|
|
|
|
|
|
|
bool hasIntersectingEdges(
|
2022-09-14 13:04:05 +02:00
|
|
|
const std::string& patternBinaryRepresentation,
|
|
|
|
const std::unordered_map<size_t, std::unordered_set<size_t>>&
|
|
|
|
intersectingEdges);
|
2020-11-27 11:47:21 +01:00
|
|
|
bool isPatternValid();
|
|
|
|
size_t getFanSize() const;
|
2022-09-14 13:04:05 +02:00
|
|
|
void add(const std::vector<vcg::Point2d>& vertices,
|
|
|
|
const std::vector<vcg::Point2i>& edges);
|
2021-03-15 18:04:29 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
PatternGeometry(const std::vector<size_t>& numberOfNodesPerSlot,
|
|
|
|
const std::vector<vcg::Point2i>& edges);
|
|
|
|
PatternGeometry(const std::filesystem::path& patternFilePath,
|
|
|
|
bool addNormalsIfAbsent = true);
|
2021-03-15 18:04:29 +01:00
|
|
|
|
|
|
|
bool createHoneycombAtom();
|
2022-09-14 13:04:05 +02:00
|
|
|
void copy(PatternGeometry& copyFrom);
|
2021-03-15 18:04:29 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
void tilePattern(VCGEdgeMesh& pattern,
|
|
|
|
VCGPolyMesh& tileInto,
|
|
|
|
const int& interfaceNodeIndex,
|
|
|
|
const bool& shouldDeleteDanglingEdges);
|
2021-03-15 18:04:29 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
void scale(const double& desiredBaseTriangleCentralEdgeSize);
|
2021-03-15 18:04:29 +01:00
|
|
|
|
|
|
|
double getBaseTriangleHeight() const;
|
2021-04-30 12:13:58 +02:00
|
|
|
vcg::Triangle3<double> computeBaseTriangle() const;
|
2022-05-06 15:26:05 +02:00
|
|
|
void updateBaseTriangle();
|
|
|
|
double computeBaseTriangleHeight() const;
|
|
|
|
void updateBaseTriangleHeight();
|
2021-03-15 18:04:29 +01:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
// PatternGeometry(const std::vector<vcg::Point2d> &vertices, const
|
|
|
|
// std::vector<vcg::Point2i> &edges); static std::shared_ptr<PatternGeometry>
|
|
|
|
// tilePattern(
|
2021-04-30 12:13:58 +02:00
|
|
|
// std::vector<PatternGeometry> &pattern,
|
|
|
|
// const std::vector<int> &connectToNeighborsVi,
|
|
|
|
// const VCGPolyMesh &tileInto,
|
|
|
|
// std::vector<int> &tileIntoEdgesToTiledVi,
|
|
|
|
// std::vector<std::vector<size_t>> &perPatternEdges);
|
2022-09-14 13:04:05 +02:00
|
|
|
virtual void createFan(/*const std::vector<int> &connectToNeighborsVi =
|
|
|
|
std::vector<int>(),*/
|
|
|
|
const size_t& fanSize = 6);
|
|
|
|
int interfaceNodeIndex{
|
|
|
|
3}; // TODO: Fix this. This should be automatically computed
|
|
|
|
bool hasAngleSmallerThanThreshold(
|
|
|
|
const std::vector<size_t>& numberOfNodesPerSlot,
|
|
|
|
const double& angleThreshold_degrees,
|
|
|
|
const bool shouldBreak = false);
|
2021-04-30 12:13:58 +02:00
|
|
|
vcg::Triangle3<double> getBaseTriangle() const;
|
|
|
|
static std::shared_ptr<PatternGeometry> tilePattern(
|
2022-09-14 13:04:05 +02:00
|
|
|
PatternGeometry& pattern,
|
|
|
|
const std::vector<int>& connectToNeighborsVi,
|
|
|
|
const VCGPolyMesh& tileInto,
|
|
|
|
std::vector<int>& tileIntoEdgesToTiledVi);
|
|
|
|
static std::shared_ptr<PatternGeometry> tilePattern(
|
|
|
|
std::vector<ConstPatternGeometry>& patterns,
|
|
|
|
const std::vector<int>& connectToNeighborsVi,
|
|
|
|
const VCGPolyMesh& tileInto,
|
|
|
|
const std::vector<int>& perSurfaceFacePatternIndices,
|
|
|
|
std::vector<size_t>& tileIntoEdgesToTiledVi,
|
|
|
|
std::vector<std::vector<size_t>>& perPatternIndexTiledPatternEdgeIndex);
|
|
|
|
std::unordered_set<VertexIndex> getInterfaceNodes(
|
|
|
|
const std::vector<size_t>& numberOfNodesPerSlot);
|
|
|
|
bool isInterfaceConnected(
|
|
|
|
const std::unordered_set<VertexIndex>& interfaceNodes);
|
2022-01-14 14:02:27 +01:00
|
|
|
void deleteDanglingVertices() override;
|
|
|
|
void deleteDanglingVertices(
|
2022-09-14 13:04:05 +02:00
|
|
|
vcg::tri::Allocator<VCGEdgeMesh>::PointerUpdater<VertexPointer>& pu)
|
|
|
|
override;
|
2020-11-27 11:47:21 +01:00
|
|
|
};
|
2021-04-08 20:03:23 +02:00
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
#endif // FLATPATTERNGEOMETRY_HPP
|