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
101 MRMESH_API void negate();
102
105 [[nodiscard]] MRMESH_API DistanceMap max( const DistanceMap& rhs ) const;
107 MRMESH_API const DistanceMap& mergeMax( const DistanceMap& rhs );
109 [[nodiscard]] MRMESH_API DistanceMap min( const DistanceMap& rhs ) const;
111 MRMESH_API const DistanceMap& mergeMin( const DistanceMap& rhs );
113 [[nodiscard]] MRMESH_API DistanceMap operator- ( const DistanceMap& rhs ) const;
115 MRMESH_API const DistanceMap& operator-= ( const DistanceMap& rhs );
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
129 MRMESH_API void invalidateAll();
131 MRMESH_API void clear();
132
134 [[nodiscard]] MRMESH_API DistanceMap getDerivativeMap() const;
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{
195 const Vector<float, UndirectedEdgeId>& perEdgeOffset;
196 enum class OffsetType
197 {
198 Normal,
199 Shell
200 } type{ OffsetType::Shell };
201};
202
203struct [[nodiscard]] ContoursDistanceMapOptions
204{
206 enum SignedDetectionMethod
207 {
211 ContourOrientation,
214 WindingRule
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
233 const ContoursDistanceMapOptions& options = {} );
234
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
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 MRMeshFwd.h:80
Definition MRDistanceMapParams.h:94
Definition MRDistanceMap.h:204
Definition MRDistanceMap.h:24
Definition MRImage.h:16
Definition MRDistanceMapParams.h:17
size_t heapBytes(const BitSet &bs)
returns the amount of memory given BitSet occupies on heap
Definition MRMesh/MRBitSet.h:298
constexpr const V & get(const Box< V > &box) noexcept
get<0> returns min, get<1> returns max
Definition MRMesh/MRBox.h:400
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)
constexpr auto max(A a, B b)
Definition MRImGuiVectorOperators.h:143
constexpr auto min(A a, B b)
Definition MRImGuiVectorOperators.h:141
Definition MRCameraOrientationPlugin.h:8
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:29
float getValue(FloatGrid grid, Vector3i p)
int heapBytes(FloatGrid grid)
Definition MRMatrix.h:16