#ifndef EDGEMESH_HPP #define EDGEMESH_HPP #include "beam.hpp" #include "mesh.hpp" #include "utilities.hpp" #include #include #include #include #ifdef POLYSCOPE_DEFINED #include #endif using EdgeIndex = size_t; class VCGEdgeMeshEdgeType; class VCGEdgeMeshVertexType; struct VCGEdgeMeshUsedTypes : public vcg::UsedTypes::AsVertexType, vcg::Use::AsEdgeType> {}; class VCGEdgeMeshVertexType : public vcg::Vertex {}; class VCGEdgeMeshEdgeType : public vcg::Edge {}; class VCGEdgeMesh : public vcg::tri::TriMesh, std::vector>, public Mesh { protected: Eigen::MatrixX2i eigenEdges; Eigen::MatrixX3d eigenVertices; Eigen::MatrixX3d eigenEdgeNormals; void computeEdges(Eigen::MatrixX2i &edges); void computeVertices(Eigen::MatrixX3d &vertices); public: VCGEdgeMesh(); template size_t getIndex(const MeshElement &meshElement) { return vcg::tri::Index(*this, meshElement); } void updateEigenEdgeAndVertices(); /* * The copy function shold be a virtual function of the base interface Mesh class. * https://stackoverflow.com/questions/2354210/can-a-class-member-function-template-be-virtual * use type erasure (?) * */ bool copy(VCGEdgeMesh &mesh); void set(const std::vector &vertexPositions, const std::vector &edges); void removeDuplicateVertices(); virtual void deleteDanglingVertices(); virtual void deleteDanglingVertices( vcg::tri::Allocator::PointerUpdater &pu); void computeEdges(Eigen::MatrixX3d &edgeStartingPoints, Eigen::MatrixX3d &edgeEndingPoints) const; Eigen::MatrixX3d getNormals() const; bool plyFileHasAllRequiredFields(const std::string &plyFilename); // bool loadUsingNanoply(const std::string &plyFilename); bool load(const std::filesystem::path &meshFilePath) override; bool save(const std::filesystem::path &meshFilePath = std::filesystem::path()) override; bool createSpanGrid(const size_t squareGridDimension); bool createSpanGrid(const size_t desiredWidth, const size_t desiredHeight); void createSpiral(const float °reesOfArm, const size_t &numberOfSamples); Eigen::MatrixX2i getEigenEdges() const; std::vector computeEdges(); Eigen::MatrixX3d getEigenVertices() const; Eigen::MatrixX3d getEigenEdgeNormals() const; void printVertexCoordinates(const size_t &vi) const; #ifdef POLYSCOPE_DEFINED polyscope::CurveNetwork *registerForDrawing( const std::optional> &desiredColor = std::nullopt, const double &desiredRadius = 0.001, const bool &shouldEnable = true); void unregister() const; void drawInitialFrames(polyscope::CurveNetwork *polyscopeHandle_initialMesh) const; #endif void removeDuplicateVertices( vcg::tri::Allocator::PointerUpdater &pu_vertices, vcg::tri::Allocator::PointerUpdater &pu_edges); void centerMesh() { CoordType centerOfMass(0, 0, 0); for (const auto &v : vert) { centerOfMass = centerOfMass + v.cP(); } centerOfMass = centerOfMass / VN(); for (auto &v : vert) { v.P() = v.cP() - centerOfMass; } } void markVertices(const std::vector &vertsToMark); private: void GeneratedRegularSquaredPattern(const double angleDeg, std::vector> &pattern, const size_t &desiredNumberOfSamples); bool loadUsingDefaultLoader(const std::string &plyFilePath); }; using VectorType = VCGEdgeMesh::CoordType; using CoordType = VCGEdgeMesh::CoordType; using VertexPointer = VCGEdgeMesh::VertexPointer; using EdgePointer = VCGEdgeMesh::EdgePointer; using ConstVCGEdgeMesh = VCGEdgeMesh; #endif // EDGEMESH_HPP