MeshLib C++ Docs
Loading...
Searching...
No Matches
MRDistanceMap.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRRectIndexer.h"
4#include "MRBitSet.h"
5#include "MRAffineXf3.h"
7#include "MRPolyline.h"
8#include "MRHeapBytes.h"
9#include "MRImage.h"
10#include "MRExpected.h"
11#include <cfloat>
12#include <filesystem>
13#include <vector>
14
15namespace MR
16{
17
20
23class [[nodiscard]] DistanceMap : public RectIndexer
24{
25public:
26 DistanceMap() = default;
27
30 [[nodiscard]] MRMESH_API DistanceMap( size_t resX, size_t resY );
31
33 [[nodiscard]] MRMESH_API DistanceMap( const MR::Matrix<float>& m );
34
36 static constexpr float NOT_VALID_VALUE = std::numeric_limits<float>::lowest();
37
39 [[nodiscard]] MRMESH_API bool isValid( size_t x, size_t y ) const;
41 [[nodiscard]] MRMESH_API bool isValid( size_t i ) const;
42
44 [[nodiscard]] bool isInBounds( size_t x, size_t y ) const { return x < size_t( dims_.x ) && y < size_t( dims_.y ); }
46 [[nodiscard]] bool isInBounds( size_t i ) const { return i < size_; }
47
49 [[nodiscard]] MRMESH_API std::optional<float> get( size_t x, size_t y ) const;
51 [[nodiscard]] MRMESH_API std::optional<float> get( size_t i ) const;
54 [[nodiscard]] float& getValue( size_t x, size_t y )
55 {
56 return data_[toIndex( { int( x ), int( y ) } )];
57 }
58 [[nodiscard]] float getValue( size_t x, size_t y ) const
59 {
60 return data_[toIndex( { int( x ), int( y ) } )];
61 }
62 [[nodiscard]] float& getValue( size_t i )
63 {
64 return data_[i];
65 }
66 [[nodiscard]] float getValue( size_t i ) const
67 {
68 return data_[i];
69 }
70
71 float* data() { return data_.data(); }
72 const float* data() const { return data_.data(); }
73
83 [[nodiscard]] MRMESH_API std::optional<float> getInterpolated( float x, float y ) const;
84
88 [[nodiscard]] MRMESH_API std::optional<Vector3f> unproject( size_t x, size_t y, const AffineXf3f& toWorld ) const;
89
98 [[nodiscard]] MRMESH_API std::optional<Vector3f> unprojectInterpolated( float x, float y, const AffineXf3f& toWorld ) const;
99
102
105 [[nodiscard]] MRMESH_API DistanceMap max( const DistanceMap& rhs ) const;
109 [[nodiscard]] MRMESH_API DistanceMap min( const DistanceMap& rhs ) const;
113 [[nodiscard]] MRMESH_API DistanceMap operator- ( const DistanceMap& rhs ) const;
116
118 MRMESH_API void set( size_t x, size_t y, float val );
120 MRMESH_API void set( size_t i, float val );
122 MRMESH_API void set( std::vector<float> data );
124 MRMESH_API void unset( size_t x, size_t y );
126 MRMESH_API void unset( size_t i );
127
132
136 [[nodiscard]] MRMESH_API std::pair< DistanceMap, DistanceMap > getXYDerivativeMaps() const;
137
139 [[nodiscard]] MRMESH_API std::vector< std::pair<size_t, size_t> > getLocalMaximums() const;
140
142 [[nodiscard]] size_t resX() const
143 {
144 return dims_.x;
145 }
147 [[nodiscard]] size_t resY() const
148 {
149 return dims_.y;
150 }
151
153 [[nodiscard]] size_t numPoints() const
154 {
155 return size();
156 }
157
160 [[nodiscard]] MRMESH_API std::pair<float, float> getMinMaxValues() const;
163 [[nodiscard]] MRMESH_API std::pair<size_t, size_t> getMinIndex() const;
166 [[nodiscard]] MRMESH_API std::pair<size_t, size_t> getMaxIndex() const;
167
169 [[nodiscard]] size_t heapBytes() const
170 {
171 return MR::heapBytes( data_ );
172 }
173
174private:
175 std::vector<float> data_;
176};
177
179MRMESH_API DistanceMap combineXYderivativeMaps( std::pair<DistanceMap, DistanceMap> XYderivativeMaps );
180
184 ProgressCallback cb = {}, std::vector<MeshTriPoint> * outSamples = nullptr );
185
189 ProgressCallback cb = {}, std::vector<MeshTriPoint> * outSamples = nullptr );
190
192struct [[nodiscard]] ContoursDistanceMapOffset
193{
196 enum class OffsetType
197 {
198 Normal,
199 Shell
200 } type{ OffsetType::Shell };
201};
202
203struct [[nodiscard]] ContoursDistanceMapOptions
204{
207 {
215 } signMethod{ ContourOrientation };
217 const ContoursDistanceMapOffset* offsetParameters{ nullptr };
219 const PixelBitSet* region{ nullptr };
221 std::vector<UndirectedEdgeId>* outClosestEdges{ nullptr };
223 float minDist{ 0 };
225 float maxDist{ FLT_MAX };
226};
227
232[[nodiscard]] MRMESH_API DistanceMap distanceMapFromContours( const Polyline2& contours, const ContourToDistanceMapParams& params,
233 const ContoursDistanceMapOptions& options = {} );
234
240MRMESH_API void distanceMapFromContours( DistanceMap & distMap, const Polyline2& polyline, const ContourToDistanceMapParams& params,
241 const ContoursDistanceMapOptions& options = {} );
242
246[[nodiscard]] MRMESH_API std::vector<Vector3f> edgePointsFromContours( const Polyline2& polyline, float pixelSize, float threshold );
247
250[[nodiscard]] MRMESH_API Polyline2 distanceMapTo2DIsoPolyline( const DistanceMap& distMap, float isoValue );
251
253[[nodiscard]] MRMESH_API Polyline2 distanceMapTo2DIsoPolyline( const DistanceMap& distMap,
254 const ContourToDistanceMapParams& params, float isoValue );
255
259[[nodiscard]] MRMESH_API std::pair<Polyline2, AffineXf3f> distanceMapTo2DIsoPolyline( const DistanceMap& distMap,
260 const AffineXf3f& xf, float isoValue, bool useDepth = false );
261[[nodiscard]] MRMESH_API Polyline2 distanceMapTo2DIsoPolyline( const DistanceMap& distMap, float pixelSize, float isoValue );
262
264[[nodiscard]] MRMESH_API Polyline2 polylineOffset( const Polyline2& polyline, float pixelSize, float offset );
265
273[[nodiscard]] MRMESH_API Polyline2 contourUnion( const Polyline2& contoursA, const Polyline2& contoursB,
274 const ContourToDistanceMapParams& params, float offsetInside = 0 );
275
283[[nodiscard]] MRMESH_API Polyline2 contourIntersection( const Polyline2& contoursA, const Polyline2& contoursB,
284 const ContourToDistanceMapParams& params, float offsetInside = 0.f );
285
293[[nodiscard]] MRMESH_API Polyline2 contourSubtract( const Polyline2& contoursA, const Polyline2& contoursB,
294 const ContourToDistanceMapParams& params, float offsetInside = 0.f );
295
297[[nodiscard]] MRMESH_API Expected<Mesh> distanceMapToMesh( const DistanceMap& distMap, const AffineXf3f& toWorld, ProgressCallback cb = {} );
298
301[[nodiscard]] MRMESH_API Image convertDistanceMapToImage( const DistanceMap& distMap, float threshold = 1.f / 255 );
302
306[[nodiscard]] MRMESH_API Expected<DistanceMap> convertImageToDistanceMap( const Image& image, float threshold = 1.f / 255, bool invert = true );
307
309
310} // namespace MR
constexpr A operator-(A a)
Definition MRImGuiVectorOperators.h:98
constexpr A & operator-=(A &a, B b)
Definition MRImGuiVectorOperators.h:113
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:80
Definition MRDistanceMap.h:24
MRMESH_API void set(size_t i, float val)
sets value in index element (the coord must be valid, UB otherwise)
MRMESH_API std::optional< float > get(size_t x, size_t y) const
returns value in (X,Y) element, returns nullopt if not valid (see isValid()), UB if out of bounds.
MRMESH_API bool isValid(size_t x, size_t y) const
checks if X,Y element is valid (i.e. not NOT_VALID_VALUE; passing invalid coords to this is UB)
float getValue(size_t i) const
Definition MRDistanceMap.h:66
float & getValue(size_t i)
Definition MRDistanceMap.h:62
float * data()
Definition MRDistanceMap.h:71
MRMESH_API void negate()
replaces every valid element in the map with its negative value
const float * data() const
Definition MRDistanceMap.h:72
DistanceMap()=default
float getValue(size_t x, size_t y) const
Definition MRDistanceMap.h:58
MRMESH_API std::pair< size_t, size_t > getMaxIndex() const
MRMESH_API DistanceMap min(const DistanceMap &rhs) const
returns new Distance Map with cell-wise minimum values. Invalid values remain only if both correspond...
MRMESH_API const DistanceMap & mergeMax(const DistanceMap &rhs)
replaces values with cell-wise maximum values. Invalid values remain only if both corresponding cells...
MRMESH_API void set(std::vector< float > data)
sets all values at one time
MRMESH_API DistanceMap(size_t resX, size_t resY)
MRMESH_API DistanceMap getDerivativeMap() const
returns new derivatives map without directions
MRMESH_API DistanceMap max(const DistanceMap &rhs) const
MRMESH_API std::pair< float, float > getMinMaxValues() const
size_t resX() const
returns X resolution
Definition MRDistanceMap.h:142
MRMESH_API std::optional< Vector3f > unproject(size_t x, size_t y, const AffineXf3f &toWorld) const
MRMESH_API std::optional< float > get(size_t i) const
returns value of index element, returns nullopt if not valid (see isValid()), UB if out of bounds.
MRMESH_API std::vector< std::pair< size_t, size_t > > getLocalMaximums() const
computes single derivative map from XY spaces combined. Returns local maximums then
MRMESH_API const DistanceMap & mergeMin(const DistanceMap &rhs)
replaces values with cell-wise minimum values. Invalid values remain only if both corresponding cells...
MRMESH_API std::optional< float > getInterpolated(float x, float y) const
finds interpolated value.
size_t heapBytes() const
returns the amount of memory this object occupies on heap
Definition MRDistanceMap.h:169
MRMESH_API DistanceMap(const MR::Matrix< float > &m)
make from 2d array
float & getValue(size_t x, size_t y)
Definition MRDistanceMap.h:54
MRMESH_API std::pair< DistanceMap, DistanceMap > getXYDerivativeMaps() const
returns new derivative maps with X and Y axes direction
MRMESH_API std::pair< size_t, size_t > getMinIndex() const
size_t resY() const
returns Y resolution
Definition MRDistanceMap.h:147
bool isInBounds(size_t x, size_t y) const
Returns true if (X,Y) coordinates are in bounds.
Definition MRDistanceMap.h:44
MRMESH_API void unset(size_t x, size_t y)
invalidates value in (X,Y) element (the coords must be valid, UB otherwise)
MRMESH_API void invalidateAll()
invalidates all elements
MRMESH_API void set(size_t x, size_t y, float val)
sets value in (X,Y) element (the coords must be valid, UB otherwise)
MRMESH_API void unset(size_t i)
invalidates value in index element (the coord must be valid, UB otherwise)
MRMESH_API std::optional< Vector3f > unprojectInterpolated(float x, float y, const AffineXf3f &toWorld) const
finds 3d coordinates of the Point on the model surface for the (x,y) interpolated value
size_t numPoints() const
returns the number of pixels
Definition MRDistanceMap.h:153
MRMESH_API void clear()
clears data, sets resolutions to zero
MRMESH_API bool isValid(size_t i) const
checks if index element is valid (i.e. not NOT_VALID_VALUE; passing an invalid coord to this is UB)
bool isInBounds(size_t i) const
Returns true if a flattened coordinate is in bounds.
Definition MRDistanceMap.h:46
a class for converting 2D integer coordinates into 1D linear coordinates and backward
Definition MRRectIndexer.h:38
std::vector<T>-like container that requires specific indexing type,
Definition MRMesh/MRVector.h:19
size_t heapBytes(const BitSet &bs)
returns the amount of memory given BitSet occupies on heap
Definition MRMesh/MRBitSet.h:294
std::function< bool(float)> ProgressCallback
Definition MRMesh/MRMeshFwd.h:732
MRMESH_API std::vector< Vector3f > edgePointsFromContours(const Polyline2 &polyline, float pixelSize, float threshold)
MRMESH_API Expected< Mesh > distanceMapToMesh(const DistanceMap &distMap, const AffineXf3f &toWorld, ProgressCallback cb={})
converts distance map into mesh and applies a transformation to all points
MRMESH_API DistanceMap combineXYderivativeMaps(std::pair< DistanceMap, DistanceMap > XYderivativeMaps)
fill another distance map pair with gradients across X and Y axes of the argument map
MRMESH_API Polyline2 contourUnion(const Polyline2 &contoursA, const Polyline2 &contoursB, const ContourToDistanceMapParams &params, float offsetInside=0)
computes the union of the shapes bounded by input 2d contours
MRMESH_API DistanceMap distanceMapFromContours(const Polyline2 &contours, const ContourToDistanceMapParams &params, const ContoursDistanceMapOptions &options={})
Computes distance of 2d contours according ContourToDistanceMapParams.
MRMESH_API Polyline2 contourIntersection(const Polyline2 &contoursA, const Polyline2 &contoursB, const ContourToDistanceMapParams &params, float offsetInside=0.f)
computes the intersection of the shapes bounded by input 2d contours
MRMESH_API DistanceMap computeDistanceMapD(const MeshPart &mp, const MeshToDistanceMapParams &params, ProgressCallback cb={}, std::vector< MeshTriPoint > *outSamples=nullptr)
MRMESH_API Polyline2 distanceMapTo2DIsoPolyline(const DistanceMap &distMap, float isoValue)
MRMESH_API Polyline2 contourSubtract(const Polyline2 &contoursA, const Polyline2 &contoursB, const ContourToDistanceMapParams &params, float offsetInside=0.f)
computes the difference between the shapes bounded by contoursA and the shapes bounded by contoursB
MRMESH_API Expected< DistanceMap > convertImageToDistanceMap(const Image &image, float threshold=1.f/255, bool invert=true)
MRMESH_API Image convertDistanceMapToImage(const DistanceMap &distMap, float threshold=1.f/255)
MRMESH_API Polyline2 polylineOffset(const Polyline2 &polyline, float pixelSize, float offset)
constructs an offset contour for given polyline
MRMESH_API DistanceMap computeDistanceMap(const MeshPart &mp, const MeshToDistanceMapParams &params, ProgressCallback cb={}, std::vector< MeshTriPoint > *outSamples=nullptr)
Definition MRCameraOrientationPlugin.h:8
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:29
tl::expected< T, E > Expected
Definition MRExpected.h:28
Structure with parameters to generate DistanceMap by Contours.
Definition MRDistanceMapParams.h:94
Structure with parameters for optional offset in distanceMapFromContours function.
Definition MRDistanceMap.h:193
const Vector< float, UndirectedEdgeId > & perEdgeOffset
offset values for each undirected edge of given polyline
Definition MRDistanceMap.h:195
OffsetType
Definition MRDistanceMap.h:197
Definition MRDistanceMap.h:204
SignedDetectionMethod
method to calculate sign
Definition MRDistanceMap.h:207
@ ContourOrientation
Definition MRDistanceMap.h:211
Definition MRImage.h:16
Definition MRMatrix.h:16
Definition MRDistanceMapParams.h:17