MeshLib
 
Loading...
Searching...
No Matches
MRSurfaceDistanceBuilder.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRId.h"
4#include "MRVector.h"
5#include "MRVector3.h"
6#include <cfloat>
7#include <optional>
8#include <queue>
9
10namespace MR
11{
12
16
18{
22 float distance = FLT_MAX;
23
24 VertDistance() = default;
25 VertDistance( VertId v, float d ) : vert( v ), distance( d ) { }
26};
27
29inline bool operator <( const VertDistance & a, const VertDistance & b )
30{
31 return a.distance > b.distance;
32}
33
36{
37public:
38 MRMESH_API SurfaceDistanceBuilder( const Mesh & mesh, const VertBitSet* region );
39 SurfaceDistanceBuilder( const Mesh & mesh, const Vector3f & target, const VertBitSet* region ) :
40 SurfaceDistanceBuilder( mesh, region) { target_ = target; }
42 MRMESH_API void addStartRegion( const VertBitSet & region, float startDistance );
46 MRMESH_API void addStart( const MeshTriPoint & start );
47
51
55 VertScalars takeDistanceMap() { return std::move( vertDistanceMap_ ); }
56
57public:
59 bool done() const { return nextVerts_.empty(); }
61 float doneDistance() const { return nextVerts_.empty() ? FLT_MAX : nextVerts_.top().distance; }
62
63private:
64 const Mesh & mesh_;
65 const VertBitSet* region_{nullptr};
66 VertScalars vertDistanceMap_;
67 Vector<char,VertId> vertUpdatedTimes_;
68 std::priority_queue<VertDistance> nextVerts_;
69 std::optional<Vector3f> target_;
70 int maxVertUpdates_ = 3;
71
75 bool suggestVertDistance_( VertDistance c );
77 void suggestDistancesAround_( VertId v );
79 void considerLeftTriPath_( EdgeId e );
81 float metricToPenalty_( float metric, VertId v ) const;
82};
83
85
86} // namespace MR
int VertId
Definition MRDotNet/MRMeshFwd.h:51
int EdgeId
Definition MRDotNet/MRMeshFwd.h:52
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:46
Definition MRDotNet/MRBitSet.h:39
this class is responsible for iterative construction of distance map along the surface
Definition MRSurfaceDistanceBuilder.h:36
MRMESH_API void addStartRegion(const VertBitSet &region, float startDistance)
initiates distance construction from given vertices with known start distance in all of them (region ...
MRMESH_API VertId growOne()
processes one more candidate vertex, which is returned
MRMESH_API void addStart(const MeshTriPoint &start)
initiates distance construction from triangle vertices surrounding given start point (they all will b...
MRMESH_API void addStartVertices(const HashMap< VertId, float > &startVertices)
initiates distance construction from given start vertices with values in them (these vertices will NO...
float doneDistance() const
returns path length till the next candidate vertex or maximum float value if all vertices have been r...
Definition MRSurfaceDistanceBuilder.h:61
MRMESH_API void setMaxVertUpdates(int v)
VertScalars takeDistanceMap()
takes ownership over constructed distance map
Definition MRSurfaceDistanceBuilder.h:55
bool done() const
returns true if further growth is impossible
Definition MRSurfaceDistanceBuilder.h:59
SurfaceDistanceBuilder(const Mesh &mesh, const Vector3f &target, const VertBitSet *region)
Definition MRSurfaceDistanceBuilder.h:39
MRMESH_API SurfaceDistanceBuilder(const Mesh &mesh, const VertBitSet *region)
represents a 3-dimentional float-typed vector
Definition MRDotNet/MRVector3.h:8
bool operator<(const VertDistance &a, const VertDistance &b)
smaller distance to be the first
Definition MRSurfaceDistanceBuilder.h:29
Definition MRCameraOrientationPlugin.h:7
phmap::flat_hash_map< K, V, Hash, Eq > HashMap
Definition MRMesh/MRMeshFwd.h:450
Definition MRMesh/MRMeshTriPoint.h:23
Definition MRMesh/MRMesh.h:23
Definition MRSurfaceDistanceBuilder.h:18
float distance
best known distance to reach this vertex
Definition MRSurfaceDistanceBuilder.h:22
VertDistance(VertId v, float d)
Definition MRSurfaceDistanceBuilder.h:25
VertId vert
vertex in question
Definition MRSurfaceDistanceBuilder.h:20
VertDistance()=default