MeshLib
 
Loading...
Searching...
No Matches
MRPointCloudTriangulationHelpers.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRVector.h"
4#include "MRId.h"
5#include "MRConstants.h"
6#include "MRBuffer.h"
7#include "MRPointsProject.h"
8#include "MRFewSmallest.h"
9#include <climits>
10#include <optional>
11#include <queue>
12
13namespace MR
14{
20namespace TriangulationHelpers
21{
22
28MRMESH_API float updateNeighborsRadius( const VertCoords& points, VertId v, VertId boundaryV,
29 const std::vector<VertId>& fan, float baseRadius );
30
35MRMESH_API void findNeighborsInBall( const PointCloud& pointCloud, VertId v, float radius, std::vector<VertId>& neighbors );
36
44MRMESH_API float findNumNeighbors( const PointCloud& pointCloud, VertId v, int numNeis, std::vector<VertId>& neighbors,
45 FewSmallest<PointsProjectionResult> & tmp, float upDistLimitSq = FLT_MAX );
46
51MRMESH_API void filterNeighbors( const VertNormals& normals, VertId v, std::vector<VertId>& neighbors );
52
54{
55 float weight{ 0.0f }; // profit of flipping this edge
56 int id{ -1 }; // index
57
58 // needed to remove outdated queue elements
59 int prevId{ -1 }; // id of prev neighbor
60 int nextId{ -1 }; // id of next neighbor
61
62 bool stable{ false }; // if this flag is true, edge cannot be flipped
64 {
65 if ( stable == other.stable )
66 return weight < other.weight;
67 return stable;
68 }
69 bool operator==( const FanOptimizerQueueElement& other ) const = default;
70
71 bool isOutdated( const std::vector<VertId>& neighbors ) const
72 {
73 return !neighbors[nextId].valid() || !neighbors[prevId].valid();
74 }
75};
76
82{
85 std::vector<VertId> neighbors;
86
88 std::vector<std::pair<double, int>> cacheAngleOrder;
89
93
96
98 std::priority_queue<FanOptimizerQueueElement> queue;
99};
100
102{
105 float radius = 0;
106
109 int numNeis = 0;
110
112 float critAngle = PI2_F;
113
115 float boundaryAngle = 0.9f * PI_F;
116
118 const VertCoords* trustedNormals = nullptr;
119
122
124 int maxRemoves = INT_MAX;
125
127 std::vector<VertId> * allNeighbors = nullptr;
128
130 float * actualRadius = nullptr;
131
133 const PointCloud * searchNeighbors = nullptr;
134};
135
137MRMESH_API void buildLocalTriangulation( const PointCloud& cloud, VertId v, const Settings & settings,
138 TriangulatedFanData & fanData );
139
142[[nodiscard]] MRMESH_API std::optional<std::vector<SomeLocalTriangulations>> buildLocalTriangulations(
143 const PointCloud& cloud, const Settings & settings, const ProgressCallback & progress = {} );
144
146[[nodiscard]] MRMESH_API std::optional<AllLocalTriangulations> buildUnitedLocalTriangulations(
147 const PointCloud& cloud, const Settings & settings, const ProgressCallback & progress = {} );
148
158[[nodiscard]] MRMESH_API bool isBoundaryPoint( const PointCloud& cloud, VertId v, const Settings & settings,
159 TriangulatedFanData & fanData );
160
162[[nodiscard]] MRMESH_API std::optional<VertBitSet> findBoundaryPoints( const PointCloud& pointCloud, const Settings & settings,
163 ProgressCallback cb = {} );
164
165
166} //namespace TriangulationHelpers
167
168} //namespace MR
List< Vector3f^> VertNormals
Definition MRDotNet/MRMeshFwd.h:98
List< Vector3f^> VertCoords
Definition MRDotNet/MRMeshFwd.h:95
int VertId
Definition MRDotNet/MRMeshFwd.h:51
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:46
the class stores some number of smallest elements from a larger number of candidates
Definition MRFewSmallest.h:14
std::function< bool(float)> ProgressCallback
Definition MRMesh/MRMeshFwd.h:589
MRMESH_API void findNeighborsInBall(const PointCloud &pointCloud, VertId v, float radius, std::vector< VertId > &neighbors)
Finds all neighbors of v in given radius (v excluded)
MRMESH_API float updateNeighborsRadius(const VertCoords &points, VertId v, VertId boundaryV, const std::vector< VertId > &fan, float baseRadius)
Finds max radius of neighbors search, for possible better local triangulation.
MRMESH_API bool isBoundaryPoint(const PointCloud &cloud, VertId v, const Settings &settings, TriangulatedFanData &fanData)
Checks if given vertex is on boundary of the point cloud, by constructing local triangulation around ...
MRMESH_API void filterNeighbors(const VertNormals &normals, VertId v, std::vector< VertId > &neighbors)
Filter neighbors with crossing normals.
MRMESH_API float findNumNeighbors(const PointCloud &pointCloud, VertId v, int numNeis, std::vector< VertId > &neighbors, FewSmallest< PointsProjectionResult > &tmp, float upDistLimitSq=FLT_MAX)
Finds at most given number of neighbors of v (v excluded)
MRMESH_API std::optional< std::vector< SomeLocalTriangulations > > buildLocalTriangulations(const PointCloud &cloud, const Settings &settings, const ProgressCallback &progress={})
MRMESH_API std::optional< VertBitSet > findBoundaryPoints(const PointCloud &pointCloud, const Settings &settings, ProgressCallback cb={})
Returns bit set of points that are considered as boundary by calling isBoundaryPoint in each.
MRMESH_API void buildLocalTriangulation(const PointCloud &cloud, VertId v, const Settings &settings, TriangulatedFanData &fanData)
constructs local triangulation around given point
MRMESH_API std::optional< AllLocalTriangulations > buildUnitedLocalTriangulations(const PointCloud &cloud, const Settings &settings, const ProgressCallback &progress={})
Definition MRCameraOrientationPlugin.h:7
Definition MRMesh/MRPointCloud.h:16
Definition MRPointCloudTriangulationHelpers.h:54
bool stable
Definition MRPointCloudTriangulationHelpers.h:62
bool operator==(const FanOptimizerQueueElement &other) const =default
float weight
Definition MRPointCloudTriangulationHelpers.h:55
int prevId
Definition MRPointCloudTriangulationHelpers.h:59
int nextId
Definition MRPointCloudTriangulationHelpers.h:60
bool operator<(const FanOptimizerQueueElement &other) const
Definition MRPointCloudTriangulationHelpers.h:63
bool isOutdated(const std::vector< VertId > &neighbors) const
Definition MRPointCloudTriangulationHelpers.h:71
Definition MRPointCloudTriangulationHelpers.h:102
int maxRemoves
the maximum number of optimization steps (removals) in local triangulation
Definition MRPointCloudTriangulationHelpers.h:124
float boundaryAngle
the vertex is considered as boundary if its neighbor ring has angle more than this value
Definition MRPointCloudTriangulationHelpers.h:115
int numNeis
Definition MRPointCloudTriangulationHelpers.h:109
bool automaticRadiusIncrease
automatic increase of the radius if points outside can make triangles from original radius not-Delone
Definition MRPointCloudTriangulationHelpers.h:121
std::vector< VertId > * allNeighbors
optional output of considered neighbor points after filtering but before triangulation/optimization
Definition MRPointCloudTriangulationHelpers.h:127
const PointCloud * searchNeighbors
optional: if provided this cloud will be used for searching of neighbors (so it must have same validP...
Definition MRPointCloudTriangulationHelpers.h:133
const VertCoords * trustedNormals
if oriented normals are known, they will be used for neighbor points selection
Definition MRPointCloudTriangulationHelpers.h:118
float * actualRadius
optional output: actual radius of neighbor search (after increase if any)
Definition MRPointCloudTriangulationHelpers.h:130
float critAngle
max allowed angle for triangles in fan
Definition MRPointCloudTriangulationHelpers.h:112
float radius
Definition MRPointCloudTriangulationHelpers.h:105
Data with caches for optimizing fan triangulation.
Definition MRPointCloudTriangulationHelpers.h:82
std::priority_queue< FanOptimizerQueueElement > queue
the queue to optimize local triangulation, here to avoid allocations for each point
Definition MRPointCloudTriangulationHelpers.h:98
FewSmallest< PointsProjectionResult > nearesetPoints
the storage to collect n-nearest neighbours, here to avoid allocations for each point
Definition MRPointCloudTriangulationHelpers.h:95
VertId border
Definition MRPointCloudTriangulationHelpers.h:92
std::vector< std::pair< double, int > > cacheAngleOrder
temporary reusable storage to avoid allocations for each point
Definition MRPointCloudTriangulationHelpers.h:88
std::vector< VertId > neighbors
Definition MRPointCloudTriangulationHelpers.h:85