23 template<
typename T,
typename F1,
typename F2>
24 void buildFromContours(
const std::vector<std::vector<T>> & contours, F1 && reservePoints, F2 && addPoint );
28 MRMESH_API
void buildOpenLines(
const std::vector<VertId> & comp2firstVert );
31 template<
typename T,
typename F>
32 [[nodiscard]] std::vector<std::vector<T>>
convertToContours( F&& getPoint, std::vector<std::vector<VertId>>* vertMap =
nullptr )
const;
45 MRMESH_API EdgeId
makeEdge( VertId a, VertId b, EdgeId e = {} );
52 [[nodiscard]] MRMESH_API
bool isLoneEdge( EdgeId a )
const;
85 MRMESH_API
void deleteEdges(
const UndirectedEdgeBitSet & es );
94 MRMESH_API
void splice( EdgeId a, EdgeId b );
97 [[nodiscard]] EdgeId
next( EdgeId he )
const { assert(he.valid());
return edges_[he].next; }
100 [[nodiscard]] VertId
org( EdgeId he )
const { assert(he.valid());
return edges_[he].org; }
103 [[nodiscard]] VertId
dest( EdgeId he )
const { assert(he.valid());
return edges_[he.sym()].org; }
107 MRMESH_API
void setOrg( EdgeId a, VertId v );
116 [[nodiscard]] EdgeId
edgeWithOrg( VertId a )
const { assert( a.valid() );
return a < int(edgePerVertex_.
size()) && edgePerVertex_[a].valid() ? edgePerVertex_[a] : EdgeId(); }
119 [[nodiscard]]
bool hasVert( VertId a )
const {
return validVerts_.test( a ); }
131 [[nodiscard]] VertId
addVertId() { edgePerVertex_.
push_back( {} ); validVerts_.push_back(
false );
return VertId( (
int)edgePerVertex_.
size() - 1 ); }
140 void vertReserve(
size_t newCapacity ) { edgePerVertex_.
reserve( newCapacity ); validVerts_.reserve( newCapacity ); }
143 [[nodiscard]]
size_t vertSize()
const {
return edgePerVertex_.
size(); }
149 [[nodiscard]]
const VertBitSet &
getValidVerts()
const {
return validVerts_; }
152 [[nodiscard]]
const VertBitSet &
getVertIds(
const VertBitSet * region )
const {
return region ? *region : validVerts_; }
155 [[nodiscard]] MRMESH_API EdgeId
findEdge( VertId o, VertId d )
const;
174 VertMap * outVmap =
nullptr, WholeEdgeMap * outEmap =
nullptr );
178 VertMap* outVmap =
nullptr, EdgeMap* outEmap =
nullptr );
182 MRMESH_API
void pack( VertMap * outVmap =
nullptr, WholeEdgeMap * outEmap =
nullptr );
185 MRMESH_API
void write( std::ostream & s )
const;
188 MRMESH_API
bool read( std::istream & s );
211 void setOrg_( EdgeId a, VertId v );
214 struct HalfEdgeRecord
224 explicit HalfEdgeRecord( NoInit ) noexcept :
next( noInit ),
org( noInit ) {}
232 VertBitSet validVerts_;
233 int numValidVerts_ = 0;
236template<
typename T,
typename F1,
typename F2>
241 std::vector<bool> closed;
242 closed.
reserve( contours.size() );
244 for (
const auto& c : contours )
246 const auto csize = c.size();
249 closed.push_back( c.front() == c.back() );
253 closed.push_back(
false );
262 reservePoints(
size - numClosed );
265 for (
int i = 0; i < contours.size(); ++i )
267 const auto& c = contours[i];
271 const auto v0 = addPoint( c[0] );
274 for (
int j = 1; j + 1 < c.size(); ++j )
278 const auto vj = addPoint( c[j] );
288 const auto vx = addPoint( c.back() );
293 assert( edgePerVertex_.
size() ==
size - numClosed );
296template<
typename T,
typename F>
299 std::vector<std::vector<T>> res;
301 UndirectedEdgeBitSet linesUsed;
304 for ( EdgeId e0 : linesUsed )
310 while ( curLine !=
next( curLine ) )
312 curLine =
next( curLine ).sym();
317 linesUsed.set( curLine.undirected(),
false );
321 std::vector<VertId> map;
322 auto orgV =
org( e );
323 cont.push_back( getPoint( orgV ) );
325 map.push_back( orgV );
329 cont.push_back( getPoint(
org( e ) ) );
331 if ( !linesUsed.test_set( e.undirected(),
false ) )
334 res.push_back( std::move( cont ) );
336 vertMap->push_back( std::move( map ) );
352 assert( !e0_ && !eLast_ );
370 assert( e0_ && eLast_ );
Definition MRPolylineTopology.h:18
std::vector<T>-like container that requires specific indexing type,
Definition MRVector.h:23
MRMESH_API int getVertDegree(VertId a) const
returns 0 if given vertex does not exist, 1 if it has one incident edge, and 2 if it has two incident...
MRMESH_API void deleteEdges(const UndirectedEdgeBitSet &es)
calls deleteEdge for every set bit
MRMESH_API void addPart(const PolylineTopology &from, VertMap *outVmap=nullptr, WholeEdgeMap *outEmap=nullptr)
size_t undirectedEdgeSize() const
returns the number of undirected edges (pairs of half-edges) including lone ones
Definition MRPolylineTopology.h:67
MRMESH_API bool isLoneEdge(EdgeId a) const
checks whether the edge is disconnected from all other edges and disassociated from all vertices (as ...
MRMESH_API VertId lastValidVert() const
returns last valid vertex id, or invalid id if no single valid vertex exists
MRMESH_API int makeEdges(const Edges &edges)
MRMESH_API EdgeId makePolyline(const VertId *vs, size_t num)
void vertReserve(size_t newCapacity)
sets the capacity of vertices vector
Definition MRPolylineTopology.h:140
std::size_t size() const
Definition MRVector.h:55
std::size_t capacity() const
Definition MRVector.h:63
Edges
Definition MRObjectMeshHolder.h:19
bool hasVert(VertId a) const
returns true if given vertex is present in the mesh
Definition MRPolylineTopology.h:119
EdgeId edgeWithOrg(VertId a) const
returns valid edge if given vertex is present in the mesh
Definition MRPolylineTopology.h:116
EdgeId next(EdgeId he) const
next (counter clock wise) half-edge in the origin ring
Definition MRPolylineTopology.h:97
MRMESH_API size_t computeNotLoneUndirectedEdges() const
computes the number of not-lone (valid) undirected edges
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:32
MRMESH_API EdgeId splitEdge(EdgeId e)
MRMESH_API void computeValidsFromEdges()
computes numValidVerts_ and validVerts_ from edgePerVertex_
EdgeId lastNotLoneEdge() const
returns last not lone edge id, or invalid id if no such edge exists
Definition MRPolylineTopology.h:58
MRMESH_API bool isConsistentlyOriented() const
returns true if for each edge e: e == e.next() || e.odd() == next( e ).sym().odd()
VertId org
vertex at the origin of the edge
Definition MRPolylineTopology.h:217
MRMESH_API void setOrg(EdgeId a, VertId v)
const VertBitSet & getValidVerts() const
returns cached set of all valid vertices
Definition MRPolylineTopology.h:149
MRMESH_API void vertResize(size_t newSize)
explicitly increases the size of vertices vector
MRMESH_API EdgeId makeEdge(VertId a, VertId b, EdgeId e={})
MRMESH_API EdgeId makeEdge()
creates an edge not associated with any vertex
EdgeId start(VertId v)
Definition MRPolylineTopology.h:350
void finishOpen(VertId v)
finishes the polyline adding final vertex in it
Definition MRPolylineTopology.h:375
MRMESH_API EdgeId findEdge(VertId o, VertId d) const
finds and returns edge from o to d in the mesh; returns invalid edge otherwise
void push_back(const T &t MR_LIFETIME_CAPTURE_BY_NESTED(this))
Definition MRVector.h:132
MRMESH_API bool read(std::istream &s)
loads this from binary stream
MRMESH_API size_t heapBytes() const
returns the amount of memory this object occupies on heap
void close()
closes the polyline
Definition MRPolylineTopology.h:368
MRMESH_API void pack(VertMap *outVmap=nullptr, WholeEdgeMap *outEmap=nullptr)
MRMESH_API void flip()
changes the orientation of all edges: every edge e is replaced with e.sym()
size_t vertCapacity() const
returns the number of allocated vert records
Definition MRPolylineTopology.h:146
size_t edgeSize() const
returns the number of half-edge records including lone ones
Definition MRPolylineTopology.h:61
void reserve(size_t capacity)
Definition MRVector.h:65
MRMESH_API void buildOpenLines(const std::vector< VertId > &comp2firstVert)
PolylineTopology & topology
Definition MRPolylineTopology.h:345
const Vector< EdgeId, VertId > & edgePerVertex() const
for all valid vertices this vector contains an edge with the origin there
Definition MRPolylineTopology.h:110
VertId org(EdgeId he) const
returns origin vertex of half-edge
Definition MRPolylineTopology.h:100
MRMESH_API UndirectedEdgeId lastNotLoneUndirectedEdge() const
returns last not lone undirected edge id, or invalid id if no such edge exists
MRMESH_API bool checkValidity() const
verifies that all internal data structures are valid
PolylineMaker(PolylineTopology &t)
Definition MRPolylineTopology.h:346
MRMESH_API void splice(EdgeId a, EdgeId b)
const VertBitSet & getVertIds(const VertBitSet *region) const
if region pointer is not null then converts it in reference, otherwise returns all valid vertices in ...
Definition MRPolylineTopology.h:152
size_t vertSize() const
returns the number of vertex records including invalid ones
Definition MRPolylineTopology.h:143
void edgeReserve(size_t newCapacity)
sets the capacity of half-edges vector
Definition MRPolylineTopology.h:76
void buildFromContours(const std::vector< std::vector< T > > &contours, F1 &&reservePoints, F2 &&addPoint)
Definition MRPolylineTopology.h:237
MRMESH_API Vector< VertId, EdgeId > getOrgs() const
for all edges this vector contains its origin
int numValidVerts() const
returns the number of valid vertices
Definition MRPolylineTopology.h:125
EdgeId next
next counter clock wise half-edge in the origin ring
Definition MRPolylineTopology.h:216
MRMESH_API VertBitSet getPathVertices(const EdgePath &path) const
returns all vertices incident to path edges
EdgeId proceed(VertId v)
Definition MRPolylineTopology.h:359
VertId dest(EdgeId he) const
returns destination vertex of half-edge
Definition MRPolylineTopology.h:103
VertId addVertId()
creates new vert-id not associated with any edge yet
Definition MRPolylineTopology.h:131
size_t edgeCapacity() const
returns the number of allocated edge records
Definition MRPolylineTopology.h:64
MRMESH_API void deleteEdge(UndirectedEdgeId ue)
given edge becomes lone after the call, so it is un-spliced from connected edges, and if it was not c...
bool operator==(const HalfEdgeRecord &b) const
Definition MRPolylineTopology.h:219
MRMESH_API void addPartByMask(const PolylineTopology &from, const UndirectedEdgeBitSet &mask, VertMap *outVmap=nullptr, EdgeMap *outEmap=nullptr)
appends polyline topology (from) in addition to the current topology: creates new edges,...
std::vector< std::vector< T > > convertToContours(F &&getPoint, std::vector< std::vector< VertId > > *vertMap=nullptr) const
converts this topology into contours of given type using the functor returning point by its Id
Definition MRPolylineTopology.h:297
MRMESH_API bool isClosed() const
returns true if the polyline does not have any holes
bool hasEdge(EdgeId e) const
returns true if given edge is within valid range and not-lone
Definition MRPolylineTopology.h:79
bool operator!=(const PolylineTopology &b) const
Definition MRPolylineTopology.h:192
bool operator==(const PolylineTopology &b) const
comparison via edges (all other members are considered as not important caches)
Definition MRPolylineTopology.h:191
MRMESH_API void vertResizeWithReserve(size_t newSize)
explicitly increases the size of vertices vector, doubling the current capacity if it was not enough
size_t undirectedEdgeCapacity() const
returns the number of allocated undirected edges (pairs of half-edges)
Definition MRPolylineTopology.h:70
HalfEdgeRecord() noexcept=default
MRMESH_API void write(std::ostream &s) const
saves this in binary stream
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
simplifies construction of connected polyline in the topology
Definition MRPolylineTopology.h:344