MeshLib C++ Docs
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{
20 VertId vert;
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; }
41
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}
#define MRMESH_API
Definition MRMeshFwd.h:80
void addStartRegion(const VertBitSet &region, float startDistance)
initiates distance construction from given vertices with known start distance in all of them (region ...
VertId growOne()
processes one more candidate vertex, which is returned
void addStart(const MeshTriPoint &start)
initiates distance construction from triangle vertices surrounding given start point (they all will b...
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
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
void addStartVertices(const HashMap< VertId, float > &startVertices)
initiates distance construction from given start vertices with values in them (these vertices will NO...
SurfaceDistanceBuilder(const Mesh &mesh, const VertBitSet *region)
SurfaceDistanceBuilder(const Mesh &mesh, const Vector3f &target, const VertBitSet *region)
Definition MRSurfaceDistanceBuilder.h:39
phmap::flat_hash_map< K, V, Hash, Eq > HashMap
Definition MRMeshFwd.h:606
bool operator<(const VertDistance &a, const VertDistance &b)
smaller distance to be the first
Definition MRSurfaceDistanceBuilder.h:29
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRMeshTriPoint.h:26
Definition 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