34#include "MeshKernel/UndoActions/PointArrayUndo.hpp"
35#include <MeshKernel/Constants.hpp>
36#include <MeshKernel/Definitions.hpp>
37#include <MeshKernel/Entities.hpp>
38#include <MeshKernel/Mesh.hpp>
39#include <MeshKernel/Polygon.hpp>
40#include <MeshKernel/UndoActions/CompoundUndoAction.hpp>
41#include <MeshKernel/UndoActions/SphericalCoordinatesOffsetAction.hpp>
42#include <MeshKernel/UndoActions/UndoAction.hpp>
49 class CurvilinearGrid;
67 InsideNotIntersected = 0,
68 InsideAndIntersected = 1,
69 FacesWithIncludedCircumcenters = 2
86 Mesh2D(
const std::vector<Edge>& edges,
87 const std::vector<Point>& nodes,
96 Mesh2D(
const std::vector<Edge>& edges,
97 const std::vector<Point>& nodes,
98 const std::vector<std::vector<UInt>>& faceNodes,
99 const std::vector<std::uint8_t>& numFaceNodes,
121 const std::vector<std::uint8_t>& numFaceNodes);
148 std::vector<Point>& polygonNodesCache,
149 std::vector<UInt>& localNodeIndicesCache,
150 std::vector<UInt>& globalEdgeIndicesCache)
const;
223 void GetNodeTypes(std::vector<MeshNodeType>& nodeTypes)
const { nodeTypes = m_nodesTypes; }
241 double enlargementFactor,
242 std::vector<Point>& dualFace)
const;
334 static std::unique_ptr<Mesh2D>
Merge(
const std::span<const Point>& mesh1Nodes,
335 const std::span<const Edge>& mesh1Edges,
336 const std::span<const Point>& mesh2Nodes,
337 const std::span<const Edge>& mesh2Edges,
368 void FindNodesSharedByFaces(
UInt nodeIndex,
const std::vector<UInt>& sharedFaces, std::vector<UInt>& connectedNodes, std::vector<std::vector<UInt>>& faceNodeMapping)
const;
389 static constexpr double m_minimumEdgeLength = 1e-4;
390 static constexpr double m_curvilinearToOrthogonalRatio = 0.5;
391 static constexpr double m_minimumCellArea = 1e-12;
392 static constexpr UInt m_maximumNumberOfHangingNodesAlongEdge = 5;
395 using HangingNodeIndexArray = std::array<UInt, m_maximumNumberOfHangingNodesAlongEdge>;
398 void ComputeAverageAreOfNeighbouringFaces(
const UInt faceId,
UInt& numNonBoundaryFaces,
double& averageOtherFacesArea)
const;
401 void FindSmallestCornerAngle(
const UInt faceId,
402 double& minCosPhiSmallTriangle,
403 UInt& nodeToPreserve,
404 UInt& firstNodeToMerge,
405 UInt& secondNodeToMerge,
406 UInt& thirdEdgeSmallTriangle)
const;
409 void DeleteSmallTriangle(
const UInt nodeToPreserve,
410 const UInt firstNodeToMerge,
411 const UInt secondNodeToMerge,
413 CompoundUndoAction& undoAction);
416 void FindNodesToDelete(
const Polygons& polygon,
417 const bool invertDeletion,
418 std::vector<bool>& isNodeInsidePolygon,
419 std::vector<bool>& deleteNode)
const;
422 void DeletedMeshNodesAndEdges(
const std::function<
bool(
UInt)>& excludedFace,
423 std::vector<bool>& deleteNode,
424 CompoundUndoAction& deleteMeshAction);
427 std::vector<int> ComputeNodeMask(
const Polygons& polygons)
const;
430 std::vector<int> ComputeEdgeMask(
const std::vector<int>& nodeMask,
431 bool includeIntersected)
const;
434 void RemoveIntersected(
const std::vector<int>& edgeMask,
435 std::vector<int>& secondEdgeMask)
const;
438 void InvertSelection(
const std::vector<int>& edgeMask,
439 std::vector<int>& secondEdgeMask)
const;
442 std::vector<bool> FindFacesEntirelyInsidePolygon(
const std::vector<bool>& isNodeInsidePolygon)
const;
445 void WalkBoundaryFromNode(
const Polygon& polygon,
446 std::vector<bool>& isVisited,
448 std::vector<Point>& meshBoundaryPolygon)
const;
453 void WalkMultiBoundaryFromNode(std::vector<bool>& edgeIsVisited,
454 std::vector<bool>& nodeIsVisited,
456 std::vector<Point>& meshBoundaryPolygon,
457 std::vector<UInt>& nodeIds,
458 std::vector<Point>& subSequence)
const;
461 void OrientatePolygonsAntiClockwise(std::vector<Point>& polygonNodes)
const;
466 std::vector<Point> RemoveOuterDomainBoundaryPolygon(
const std::vector<Point>& polygonNodes)
const;
472 [[nodiscard]] std::unique_ptr<UndoAction> DeleteMeshFaces(
const Polygons& polygon,
bool invertDeletion);
475 void AppendCellPolygon(
const UInt faceId);
478 void DeleteMeshHoles(CompoundUndoAction* undoAction);
485 std::unique_ptr<UndoAction> UpdateFaceInformation(
const std::vector<UInt>& faceIndices,
const bool appendDeletedFaces);
497 void FindFacesRecursive(
UInt startNode,
500 UInt numClosingEdges,
501 std::vector<UInt>& edges,
502 std::vector<UInt>& nodes,
503 std::vector<UInt>& sortedEdges,
504 std::vector<UInt>& sortedNodes,
505 std::vector<Point>& nodalValues);
511 [[nodiscard]]
bool HasTriangleNoAcuteAngles(
const std::vector<UInt>& faceNodes,
const std::vector<Point>& nodes)
const;
516 bool HasDuplicateNodes(
const UInt numClosingEdges,
const std::vector<UInt>& node, std::vector<UInt>& sortedNodes)
const;
521 bool HasDuplicateEdgeFaces(
const UInt numClosingEdges,
const std::vector<UInt>& edges, std::vector<UInt>& sortedEdgesFaces)
const;
524 void ResizeAndInitializeFaceVectors();
529 void DoAdministrationGivenFaceNodesMapping(
const std::vector<std::vector<UInt>>& faceNodes,
530 const std::vector<std::uint8_t>& numFaceNodes);
534 void DoAdministration(CompoundUndoAction* undoAction =
nullptr);
537 void InitialiseBoundaryNodeClassification(std::vector<int>& intNodeType)
const;
543 void ComputeAverageFlowEdgesLength(std::vector<double>& edgesLength,
544 std::vector<double>& averageFlowEdgesLength)
const;
547 void ComputeAverageEdgeLength(
const std::vector<double>& edgesLength,
548 const std::vector<double>& averageFlowEdgesLength,
549 std::vector<bool>& curvilinearGridIndicator,
550 std::vector<std::array<double, 2>>& averageEdgesLength,
551 std::vector<double>& aspectRatios)
const;
555 UInt InvalidateEdgesWithNoFace();
557 std::vector<MeshNodeType> m_nodesTypes;
558 std::vector<Point> m_invalidCellPolygons;
A class defining a bounding box.
Definition BoundingBox.hpp:40
A class derived from Mesh, which describes unstructures 2d meshes.
Definition Mesh2D.hpp:59
Mesh2D()
Default constructor.
Mesh2D(const std::vector< Edge > &edges, const std::vector< Point > &nodes, const std::vector< std::vector< UInt > > &faceNodes, const std::vector< std::uint8_t > &numFaceNodes, Projection projection)
Construct a mesh2d from face nodes and num face nodes.
~Mesh2D() override=default
Default destructor.
std::vector< int > NodeMaskFromEdgeMask(std::vector< int > const &edgeMask) const
From the edge mask compute the node mask.
static std::unique_ptr< Mesh2D > Merge(const std::span< const Point > &mesh1Nodes, const std::span< const Edge > &mesh1Edges, const std::span< const Point > &mesh2Nodes, const std::span< const Edge > &mesh2Edges, const Projection projection)
Merges mesh node and edge connectivity into a single mesh.
std::unique_ptr< meshkernel::UndoAction > DeleteSmallFlowEdges(double smallFlowEdgesThreshold)
Deletes small flow edges (removesmallflowlinks, part 1)
void ComputeFaceClosedPolygonWithLocalMappings(UInt faceIndex, std::vector< Point > &polygonNodesCache, std::vector< UInt > &localNodeIndicesCache, std::vector< UInt > &globalEdgeIndicesCache) const
For a face create a closed polygon and fill local mapping caches (get_cellpolygon)
UInt NextFace(const UInt faceId, const UInt edgeId) const
Get the next face adjacent to the edge on the opposite side.
MeshNodeType GetNodeType(const UInt nodeId) const
Get the node type.
Definition Mesh2D.hpp:220
DeleteMeshOptions
Enumerator describing the different options to delete a mesh.
Definition Mesh2D.hpp:66
std::vector< BoundingBox > GetEdgesBoundingBoxes() const
Get the bounding boxes of the mesh edges.
void FindNodesSharedByFaces(UInt nodeIndex, const std::vector< UInt > &sharedFaces, std::vector< UInt > &connectedNodes, std::vector< std::vector< UInt > > &faceNodeMapping) const
Find all unique nodes.
UInt FindOppositeEdge(const UInt faceId, const UInt edgeId) const
Find edge on the opposite side of the element.
std::vector< UInt > SortedFacesAroundNode(UInt node) const
Sorts the faces around a node, sorted in counter clock wise order.
std::vector< UInt > GetHangingEdges() const
Gets the hanging edges.
std::vector< int > MaskEdgesOfFacesInPolygon(const Polygons &polygons, bool invertSelection, bool includeIntersected) const
Masks the edges of all faces entirely included in all polygons.
void MakeDualFace(const std::span< const Point > edgeCentres, UInt node, double enlargementFactor, std::vector< Point > &dualFace) const
Make a dual face around the node, enlarged by a factor.
void FindFaces()
Constructs the face nodes mapping, face mass centers and areas.
void RestoreAction(const SphericalCoordinatesOffsetAction &undoAction)
Undo the coordinate offset action.
void CommitAction(const SphericalCoordinatesOffsetAction &undoAction)
Apply the coordinate offset action.
std::tuple< UInt, UInt > IsSegmentCrossingABoundaryEdge(const Point &firstPoint, const Point &secondPoint) const
Inquire if a segment is crossing a face.
void ComputeAspectRatios(std::vector< double > &aspectRatios) const
Gets the aspect ratios (the ratios edges lengths to flow edges lengths)
UInt FindCommonFace(const UInt edge1, const UInt edge2) const
Find the id of the element that is common to both edges.
std::unique_ptr< UndoAction > DeleteSmallTrianglesAtBoundaries(double minFractionalAreaTriangles)
Deletes small triangles at the boundaries (removesmallflowlinks, part 2)
void Administrate(CompoundUndoAction *undoAction=nullptr) override
Perform complete administration.
std::vector< Point > ComputeBoundaryPolygons(const std::vector< Point > &polygon)
Convert all mesh boundaries to a vector of polygon nodes, including holes (copynetboundstopol)
std::vector< UInt > PointFaceIndices(const std::vector< Point > &points)
For a collection of points, compute the face indices including them.
UInt IsStartOrEnd(const UInt edgeId, const UInt nodeId) const
Determine if the node is at the start or end of the edge.
std::vector< UInt > GetEdgesCrossingSmallFlowEdges(double smallFlowEdgesThreshold)
Gets the edges crossing the small flow edges.
void ComputeFaceAreaAndMassCenters(bool computeMassCenters=false)
Compute face mass center.
std::unique_ptr< UndoAction > DeleteDegeneratedTriangles()
Deletes coinciding triangles.
Mesh2D(const std::vector< Point > &nodes, const Polygons &polygons, Projection projection)
Create triangular grid from nodes (triangulatesamplestonetwork)
std::vector< Point > GetFlowEdgesCenters(const std::vector< UInt > &edges) const
Gets the flow edges centers from the crossing edges.
std::vector< Point > ComputeInnerBoundaryPolygons() const
Convert all mesh boundaries to a vector of polygon nodes.
void CommitAction(PointArrayUndo &undoAction)
Set the node values.
Mesh2D(Projection projection)
Construct a mesh2d using only the projection.
static std::unique_ptr< Mesh2D > Merge(const Mesh2D &mesh1, const Mesh2D &mesh2)
Merges mesh connectivity.
std::unique_ptr< UndoAction > DeleteMesh(const Polygons &polygon, DeleteMeshOptions deletionOption, bool invertDeletion)
Deletes a mesh in a polygon, using several options (delnet)
void GetConnectingNodes(UInt nodeIndex, std::vector< UInt > &connectedNodes) const
Get indices of all nodes that are connected directly to a give node along connected edges.
Mesh2D(const std::vector< Edge > &edges, const std::vector< Point > &nodes, Projection projection)
Construct a mesh2d starting from the edges and nodes.
std::vector< int > NodeMaskFromPolygon(const Polygons &polygons, bool inside) const
Mask all nodes included in all polygons.
UInt IsLeftOrRight(const UInt elementId, const UInt edgeId) const
Determine if the element lies on the left or right side of the edge.
std::unique_ptr< UndoAction > DeleteMeshFacesInPolygon(const Polygons &polygon, const bool appendDeletedFaces=true)
Deletes the mesh faces inside a set of polygons.
std::vector< Point > GetObtuseTrianglesCenters()
Gets the mass centers of obtuse triangles.
void ComputeNodeNeighbours(std::vector< std::vector< UInt > > &nodesNodes, UInt &maxNumNeighbours) const
Computes node neighbours.
BoundingBox GetBoundingBox() const
Get the mesh bounding box.
std::unique_ptr< UndoAction > TriangulateFaces(const Polygons &polygon)
Transform non-triangular faces inside a polygon to triangular faces.
void ClassifyNodes()
Classifies the nodes (makenetnodescoding)
void RestoreAction(PointArrayUndo &undoAction)
Undo node array.
std::vector< bool > FilterBasedOnMetric(Location location, Property property, double minValue, double maxValue) const
This method generates a mask indicating which locations are within the specified range of the given m...
void FindFacesConnectedToNode(UInt nodeIndex, std::vector< UInt > &sharedFaces) const
Find all faces that have the given node as a vertex.
void GetNodeTypes(std::vector< MeshNodeType > &nodeTypes) const
Get the node type.
Definition Mesh2D.hpp:223
std::unique_ptr< SphericalCoordinatesOffsetAction > OffsetSphericalCoordinates(double minx, double maxx)
Offset the x coordinates if m_projection is spherical.
std::unique_ptr< UndoAction > DeleteHangingEdges()
Deletes the hanging edges.
void FindFacesGivenFaceNodesMapping(const std::vector< std::vector< UInt > > &faceNodes, const std::vector< std::uint8_t > &numFaceNodes)
Find remaining face information given the face nodes mapping.
std::unique_ptr< UndoAction > TriangulateFaces()
Transform non-triangular faces to triangular faces.
A class describing an unstructured mesh. This class contains the shared functionality between 1d or 2...
Definition Mesh.hpp:99
void RestoreAction(const ResetNodeAction &undoAction)
Undo the reset node action.
void CommitAction(const ResetNodeAction &undoAction)
Apply the reset node action.
A struct describing a point in a two-dimensional space.
Definition Point.hpp:41
A closed polygon.
Definition Polygon.hpp:46
A class containing a list of polygonaly enclosed regions.
Definition Polygons.hpp:45
Contains the logic of the C++ static library.
Definition AveragingInterpolation.hpp:37
Projection
Enumerator describing the supported projections.
Definition Definitions.hpp:43
MeshNodeType
Possible unstructured node types.
Definition Definitions.hpp:148
Location
Mesh locations enumeration.
Definition Definitions.hpp:76
Property
Enumerator for different properties on a 2D mesh.
Definition Definitions.hpp:158
std::uint32_t UInt
Integer type used when indexing mesh graph entities.
Definition Definitions.hpp:39