MeshLib C++ Docs
Loading...
Searching...
No Matches
MRMeshMath.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRPch/MRBindingMacros.h"
4#include "MRVector.h"
5#include "MRMeshTopology.h"
6#include "MRPointOnFace.h"
7
8namespace MR
9{
10
12[[nodiscard]] inline Vector3f orgPnt( const MeshTopology & topology, const VertCoords & points, EdgeId e )
13{
14 return points[ topology.org( e ) ];
15}
16
18[[nodiscard]] inline Vector3f destPnt( const MeshTopology & topology, const VertCoords & points, EdgeId e )
19{
20 return points[ topology.dest( e ) ];
21}
22
24[[nodiscard]] inline Vector3f edgeVector( const MeshTopology & topology, const VertCoords & points, EdgeId e )
25{
26 return destPnt( topology, points, e ) - orgPnt( topology, points, e );
27}
28
30MRMESH_API LineSegm3f edgeSegment( const MeshTopology & topology, const VertCoords & points, EdgeId e );
31
33[[nodiscard]] inline Vector3f edgePoint( const MeshTopology & topology, const VertCoords & points, EdgeId e, float f )
34{
35 return f * destPnt( topology, points, e ) + ( 1 - f ) * orgPnt( topology, points, e );
36}
37
39[[nodiscard]] inline Vector3f edgePoint( const MeshTopology & topology, const VertCoords & points, const MeshEdgePoint & ep )
40{
41 return edgePoint( topology, points, ep.e, ep.a );
42}
43
45[[nodiscard]] inline Vector3f edgeCenter( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e )
46{
47 return edgePoint( topology, points, e, 0.5f );
48}
49
51MRMESH_API void getLeftTriPoints( const MeshTopology & topology, const VertCoords & points, EdgeId e, Vector3f & v0, Vector3f & v1, Vector3f & v2 );
52
55MR_BIND_IGNORE inline void getLeftTriPoints( const MeshTopology & topology, const VertCoords & points, EdgeId e, Vector3f (&v)[3] )
56{
57 getLeftTriPoints( topology, points, e, v[0], v[1], v[2] );
58}
59
61[[nodiscard]] inline Triangle3f getLeftTriPoints( const MeshTopology & topology, const VertCoords & points, EdgeId e )
62{
63 Triangle3f res;
64 getLeftTriPoints( topology, points, e, res[0], res[1], res[2] );
65 return res;
66}
67
69inline void getTriPoints( const MeshTopology & topology, const VertCoords & points, FaceId f, Vector3f & v0, Vector3f & v1, Vector3f & v2 )
70{
71 getLeftTriPoints( topology, points, topology.edgeWithLeft( f ), v0, v1, v2 );
72}
73
76MR_BIND_IGNORE inline void getTriPoints( const MeshTopology & topology, const VertCoords & points, FaceId f, Vector3f (&v)[3] )
77{
78 getTriPoints( topology, points, f, v[0], v[1], v[2] );
79}
80
82[[nodiscard]] inline Triangle3f getTriPoints( const MeshTopology & topology, const VertCoords & points, FaceId f )
83{
84 Triangle3f res;
85 getTriPoints( topology, points, f, res[0], res[1], res[2] );
86 return res;
87}
88
90[[nodiscard]] MRMESH_API Vector3f triPoint( const MeshTopology & topology, const VertCoords & points, const MeshTriPoint & p );
91
93[[nodiscard]] MRMESH_API Vector3f triCenter( const MeshTopology & topology, const VertCoords & points, FaceId f );
94
96[[nodiscard]] MRMESH_API float triangleAspectRatio( const MeshTopology & topology, const VertCoords & points, FaceId f );
97
99[[nodiscard]] MRMESH_API float circumcircleDiameterSq( const MeshTopology & topology, const VertCoords & points, FaceId f );
100
102[[nodiscard]] MRMESH_API float circumcircleDiameter( const MeshTopology & topology, const VertCoords & points, FaceId f );
103
105[[nodiscard]] MRMESH_API MeshTriPoint toTriPoint( const MeshTopology & topology, const VertCoords & points, FaceId f, const Vector3f & p );
106
108[[nodiscard]] MRMESH_API MeshTriPoint toTriPoint( const MeshTopology & topology, const VertCoords & points, const PointOnFace& p );
109
111[[nodiscard]] MRMESH_API MeshEdgePoint toEdgePoint( const MeshTopology & topology, const VertCoords & points, EdgeId e, const Vector3f & p );
112
114[[nodiscard]] MRMESH_API VertId getClosestVertex( const MeshTopology & topology, const VertCoords & points, const PointOnFace & p );
115
117[[nodiscard]] inline VertId getClosestVertex( const MeshTopology & topology, const VertCoords & points, const MeshTriPoint & p )
118{
119 return getClosestVertex( topology, points, PointOnFace{ topology.left( p.e ), triPoint( topology, points, p ) } );
120}
121
123[[nodiscard]] MRMESH_API UndirectedEdgeId getClosestEdge( const MeshTopology & topology, const VertCoords & points, const PointOnFace & p );
124
126[[nodiscard]] inline UndirectedEdgeId getClosestEdge( const MeshTopology & topology, const VertCoords & points, const MeshTriPoint & p )
127{
128 return getClosestEdge( topology, points, PointOnFace{ topology.left( p.e ), triPoint( topology, points, p ) } );
129}
130
132[[nodiscard]] inline float edgeLength( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e )
133{
134 return edgeVector( topology, points, e ).length();
135}
136
138[[nodiscard]] MRMESH_API UndirectedEdgeScalars edgeLengths( const MeshTopology & topology, const VertCoords & points );
139
141[[nodiscard]] inline float edgeLengthSq( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e )
142{
143 return edgeVector( topology, points, e ).lengthSq();
144}
145
147[[nodiscard]] MRMESH_API Vector3f leftDirDblArea( const MeshTopology & topology, const VertCoords & points, EdgeId e );
148
150[[nodiscard]] inline Vector3f dirDblArea( const MeshTopology & topology, const VertCoords & points, FaceId f )
151{
152 return leftDirDblArea( topology, points, topology.edgeWithLeft( f ) );
153}
154
156[[nodiscard]] MRMESH_API Vector<Vector3f, VertId> dirDblAreas( const MeshTopology & topology, const VertCoords & points, const VertBitSet * region = nullptr );
157
159[[nodiscard]] inline float dblArea( const MeshTopology & topology, const VertCoords & points, FaceId f )
160{
161 return dirDblArea( topology, points, f ).length();
162}
163
165[[nodiscard]] inline float area( const MeshTopology & topology, const VertCoords & points, FaceId f )
166{
167 return 0.5f * dblArea( topology, points, f );
168}
169
171[[nodiscard]] MRMESH_API double area( const MeshTopology & topology, const VertCoords & points, const FaceBitSet & fs );
172
174[[nodiscard]] inline double area( const MeshTopology & topology, const VertCoords & points, const FaceBitSet * fs = nullptr )
175{
176 return area( topology, points, topology.getFaceIds( fs ) );
177}
178
180[[nodiscard]] MRMESH_API Vector3d dirArea( const MeshTopology & topology, const VertCoords & points, const FaceBitSet & fs );
181
183[[nodiscard]] inline Vector3d dirArea( const MeshTopology & topology, const VertCoords & points, const FaceBitSet * fs = nullptr )
184{
185 return dirArea( topology, points, topology.getFaceIds( fs ) );
186}
187
189[[nodiscard]] MRMESH_API double projArea( const MeshTopology & topology, const VertCoords & points, const Vector3f & dir, const FaceBitSet & fs );
190
192[[nodiscard]] inline double projArea( const MeshTopology & topology, const VertCoords & points, const Vector3f & dir, const FaceBitSet * fs = nullptr )
193{
194 return projArea( topology, points, dir, topology.getFaceIds( fs ) );
195}
196
199[[nodiscard]] MRMESH_API double volume( const MeshTopology & topology, const VertCoords & points, const FaceBitSet* region = nullptr );
200
202[[nodiscard]] MRMESH_API double holePerimiter( const MeshTopology & topology, const VertCoords & points, EdgeId e );
203
206[[nodiscard]] MRMESH_API Vector3d holeDirArea( const MeshTopology & topology, const VertCoords & points, EdgeId e );
207
209[[nodiscard]] MRMESH_API Vector3f leftTangent( const MeshTopology & topology, const VertCoords & points, EdgeId e );
210
212[[nodiscard]] inline Vector3f leftNormal( const MeshTopology & topology, const VertCoords & points, EdgeId e )
213{
214 return leftDirDblArea( topology, points, e ).normalized();
215}
216
218[[nodiscard]] inline Vector3f normal( const MeshTopology & topology, const VertCoords & points, FaceId f )
219{
220 return dirDblArea( topology, points, f ).normalized();
221}
222
224[[nodiscard]] MRMESH_API Plane3f getPlane3f( const MeshTopology & topology, const VertCoords & points, FaceId f );
225[[nodiscard]] MRMESH_API Plane3d getPlane3d( const MeshTopology & topology, const VertCoords & points, FaceId f );
226
228[[nodiscard]] MRMESH_API Vector3f dirDblArea( const MeshTopology & topology, const VertCoords & points, VertId v );
229
231[[nodiscard]] inline float dblArea( const MeshTopology & topology, const VertCoords & points, VertId v )
232{
233 return dirDblArea( topology, points, v ).length();
234}
235
237[[nodiscard]] inline Vector3f normal( const MeshTopology & topology, const VertCoords & points, VertId v )
238{
239 return dirDblArea( topology, points, v ).normalized();
240}
241
244[[nodiscard]] MRMESH_API Vector3f normal( const MeshTopology & topology, const VertCoords & points, const MeshTriPoint & p );
245
248[[nodiscard]] MRMESH_API Vector3f pseudonormal( const MeshTopology & topology, const VertCoords & points, VertId v, const FaceBitSet * region = nullptr );
249
251[[nodiscard]] MRMESH_API Vector3f pseudonormal( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e, const FaceBitSet * region = nullptr );
252
257[[nodiscard]] MRMESH_API Vector3f pseudonormal( const MeshTopology & topology, const VertCoords & points, const MeshTriPoint & p, const FaceBitSet * region = nullptr );
258
260[[nodiscard]] MRMESH_API float sumAngles( const MeshTopology & topology, const VertCoords & points, VertId v, bool * outBoundaryVert = nullptr );
261
263[[nodiscard]] MRMESH_API Expected<VertBitSet> findSpikeVertices( const MeshTopology & topology, const VertCoords & points, float minSumAngle, const VertBitSet* region = nullptr, const ProgressCallback& cb = {} );
264
269[[nodiscard]] MRMESH_API float dihedralAngleSin( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e );
270
275[[nodiscard]] MRMESH_API float dihedralAngleCos( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e );
276
282[[nodiscard]] MRMESH_API float dihedralAngle( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e );
283
286[[nodiscard]] MRMESH_API float discreteMeanCurvature( const MeshTopology & topology, const VertCoords & points, VertId v );
287
290[[nodiscard]] MRMESH_API float discreteMeanCurvature( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId e );
291
295[[nodiscard]] inline float discreteGaussianCurvature( const MeshTopology & topology, const VertCoords & points, VertId v, bool * outBoundaryVert = nullptr )
296{
297 return 2 * PI_F - sumAngles( topology, points, v, outBoundaryVert );
298}
299
301[[nodiscard]] MRMESH_API UndirectedEdgeBitSet findCreaseEdges( const MeshTopology & topology, const VertCoords & points, float angleFromPlanar );
302
305[[nodiscard]] MRMESH_API float leftCotan( const MeshTopology & topology, const VertCoords & points, EdgeId e );
306
309[[nodiscard]] inline float cotan( const MeshTopology & topology, const VertCoords & points, UndirectedEdgeId ue )
310{
311 EdgeId e{ ue };
312 return leftCotan( topology, points, e ) + leftCotan( topology, points, e.sym() );
313}
314
318[[nodiscard]] MRMESH_API QuadraticForm3f quadraticForm( const MeshTopology & topology, const VertCoords & points, VertId v, bool angleWeigted,
319 const FaceBitSet * region = nullptr, const UndirectedEdgeBitSet * creases = nullptr );
320
323[[nodiscard]] MRMESH_API Box3f computeBoundingBox( const MeshTopology & topology, const VertCoords & points, const FaceBitSet* region, const AffineXf3f* toWorld = nullptr );
324
326[[nodiscard]] MRMESH_API float averageEdgeLength( const MeshTopology & topology, const VertCoords & points );
327
329[[nodiscard]] MRMESH_API Vector3f findCenterFromPoints( const MeshTopology & topology, const VertCoords & points );
330
332[[nodiscard]] MRMESH_API Vector3f findCenterFromFaces( const MeshTopology & topology, const VertCoords & points );
333
335[[nodiscard]] MRMESH_API Vector3f findCenterFromBBox( const MeshTopology & topology, const VertCoords & points );
336
337} //namespace MR
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:80
Definition MRMesh/MRMeshTopology.h:19
FaceId left(EdgeId he) const
returns left face of half-edge
Definition MRMesh/MRMeshTopology.h:96
VertId dest(EdgeId he) const
returns destination vertex of half-edge
Definition MRMesh/MRMeshTopology.h:93
VertId org(EdgeId he) const
returns origin vertex of half-edge
Definition MRMesh/MRMeshTopology.h:90
EdgeId edgeWithLeft(FaceId a) const
returns valid edge if given vertex is present in the mesh
Definition MRMesh/MRMeshTopology.h:229
const FaceBitSet & getFaceIds(const FaceBitSet *region) const
if region pointer is not null then converts it in reference, otherwise returns all valid faces in the...
Definition MRMesh/MRMeshTopology.h:283
std::vector<T>-like container that requires specific indexing type,
Definition MRMesh/MRVector.h:19
std::function< bool(float)> ProgressCallback
Definition MRMesh/MRMeshFwd.h:728
Box< V > computeBoundingBox(const Vector< V, VertId > &points, VertId firstVert, VertId lastVert, const VertBitSet *region=nullptr, const AffineXf< V > *toWorld=nullptr)
Definition MRCameraOrientationPlugin.h:8
MRMESH_API Vector3f findCenterFromBBox(const MeshTopology &topology, const VertCoords &points)
computes bounding box and returns its center
float discreteGaussianCurvature(const MeshTopology &topology, const VertCoords &points, VertId v, bool *outBoundaryVert=nullptr)
Definition MRMeshMath.h:295
MRMESH_API Vector3f findCenterFromFaces(const MeshTopology &topology, const VertCoords &points)
computes center of mass considering that density of all triangles is the same
MRMESH_API Vector3f findCenterFromPoints(const MeshTopology &topology, const VertCoords &points)
computes average position of all valid mesh vertices
MRMESH_API UndirectedEdgeScalars edgeLengths(const MeshTopology &topology, const VertCoords &points)
computes and returns the lengths of all edges in the mesh
MRMESH_API Expected< VertBitSet > findSpikeVertices(const MeshTopology &topology, const VertCoords &points, float minSumAngle, const VertBitSet *region=nullptr, const ProgressCallback &cb={})
returns vertices where the sum of triangle angles is below given threshold
float area(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns the area of given face
Definition MRMeshMath.h:165
MRMESH_API Vector3f leftTangent(const MeshTopology &topology, const VertCoords &points, EdgeId e)
computes unit vector that is both orthogonal to given edge and to the normal of its left triangle,...
MRMESH_API float circumcircleDiameter(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns circumcircle diameter of given mesh triangle
Vector3f edgeVector(const MeshTopology &topology, const VertCoords &points, EdgeId e)
returns vector equal to edge destination point minus edge origin point
Definition MRMeshMath.h:24
MRMESH_API float dihedralAngle(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
MRMESH_API MeshEdgePoint toEdgePoint(const MeshTopology &topology, const VertCoords &points, EdgeId e, const Vector3f &p)
converts edge and 3d point into edge-point representation
MRMESH_API Vector3f triCenter(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns the centroid of given triangle
MRMESH_API UndirectedEdgeBitSet findCreaseEdges(const MeshTopology &topology, const VertCoords &points, float angleFromPlanar)
finds all mesh edges where dihedral angle is distinct from planar PI angle on at least given value
MRMESH_API float dihedralAngleCos(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
MRMESH_API QuadraticForm3f quadraticForm(const MeshTopology &topology, const VertCoords &points, VertId v, bool angleWeigted, const FaceBitSet *region=nullptr, const UndirectedEdgeBitSet *creases=nullptr)
void getTriPoints(const MeshTopology &topology, const VertCoords &points, FaceId f, Vector3f &v0, Vector3f &v1, Vector3f &v2)
returns three points of given face
Definition MRMeshMath.h:69
MRMESH_API Vector3d holeDirArea(const MeshTopology &topology, const VertCoords &points, EdgeId e)
MRMESH_API MeshTriPoint toTriPoint(const MeshTopology &topology, const VertCoords &points, FaceId f, const Vector3f &p)
converts face id and 3d point into barycentric representation
MRMESH_API float averageEdgeLength(const MeshTopology &topology, const VertCoords &points)
computes average length of an edge in the mesh given by (topology, points)
Vector3f destPnt(const MeshTopology &topology, const VertCoords &points, EdgeId e)
returns coordinates of the edge destination
Definition MRMeshMath.h:18
MRMESH_API float leftCotan(const MeshTopology &topology, const VertCoords &points, EdgeId e)
Vector3f dirDblArea(const MeshTopology &topology, const VertCoords &points, FaceId f)
computes directed double area for a triangular face from its vertices
Definition MRMeshMath.h:150
MRMESH_API float triangleAspectRatio(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns aspect ratio of given mesh triangle equal to the ratio of the circum-radius to twice its in-r...
MRMESH_API Vector3d dirArea(const MeshTopology &topology, const VertCoords &points, const FaceBitSet &fs)
computes the sum of directed areas for faces from given region
tl::expected< T, E > Expected
Definition MRExpected.h:25
MRMESH_API void getLeftTriPoints(const MeshTopology &topology, const VertCoords &points, EdgeId e, Vector3f &v0, Vector3f &v1, Vector3f &v2)
returns three points of left face of e: v0 = orgPnt( e ), v1 = destPnt( e )
Vector3f edgePoint(const MeshTopology &topology, const VertCoords &points, EdgeId e, float f)
returns a point on the edge: origin point for f=0 and destination point for f=1
Definition MRMeshMath.h:33
MRMESH_API Vector3f pseudonormal(const MeshTopology &topology, const VertCoords &points, VertId v, const FaceBitSet *region=nullptr)
float edgeLengthSq(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
returns squared Euclidean length of the edge (faster to compute than length)
Definition MRMeshMath.h:141
MRMESH_API double volume(const MeshTopology &topology, const VertCoords &points, const FaceBitSet *region=nullptr)
MRMESH_API Vector3f triPoint(const MeshTopology &topology, const VertCoords &points, const MeshTriPoint &p)
computes coordinates of point given as face and barycentric representation
Vector3f orgPnt(const MeshTopology &topology, const VertCoords &points, EdgeId e)
returns coordinates of the edge origin
Definition MRMeshMath.h:12
MRMESH_API float discreteMeanCurvature(const MeshTopology &topology, const VertCoords &points, VertId v)
MRMESH_API float circumcircleDiameterSq(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns squared circumcircle diameter of given mesh triangle
Vector3f edgeCenter(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
computes the center of given edge
Definition MRMeshMath.h:45
MRMESH_API UndirectedEdgeId getClosestEdge(const MeshTopology &topology, const VertCoords &points, const PointOnFace &p)
returns one of three face edges, closest to given point
float dblArea(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns twice the area of given face
Definition MRMeshMath.h:159
Triangle3< float > Triangle3f
Definition MRMesh/MRMeshFwd.h:461
float edgeLength(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
returns Euclidean length of the edge
Definition MRMeshMath.h:132
std::array< Vector3f, 3 > MR_BIND_IGNORE
Definition MRMeshBuilderTypes.h:10
MRMESH_API double holePerimiter(const MeshTopology &topology, const VertCoords &points, EdgeId e)
computes the perimeter of the hole specified by one of its edges with no valid left face (left is hol...
MRMESH_API Plane3f getPlane3f(const MeshTopology &topology, const VertCoords &points, FaceId f)
returns the plane containing given triangular face with normal looking outwards
MRMESH_API VertId getClosestVertex(const MeshTopology &topology, const VertCoords &points, const PointOnFace &p)
returns one of three face vertices, closest to given point
MRMESH_API Vector3f leftDirDblArea(const MeshTopology &topology, const VertCoords &points, EdgeId e)
computes directed double area of left triangular face of given edge
MRMESH_API double projArea(const MeshTopology &topology, const VertCoords &points, const Vector3f &dir, const FaceBitSet &fs)
computes the sum of absolute projected area of faces from given region as visible if look from given ...
float cotan(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId ue)
Definition MRMeshMath.h:309
MRMESH_API Plane3d getPlane3d(const MeshTopology &topology, const VertCoords &points, FaceId f)
MRMESH_API float sumAngles(const MeshTopology &topology, const VertCoords &points, VertId v, bool *outBoundaryVert=nullptr)
computes the sum of triangle angles at given vertex; optionally returns whether the vertex is on boun...
Vector3f leftNormal(const MeshTopology &topology, const VertCoords &points, EdgeId e)
computes triangular face normal from its vertices
Definition MRMeshMath.h:212
MRMESH_API LineSegm3f edgeSegment(const MeshTopology &topology, const VertCoords &points, EdgeId e)
returns line segment of given edge
MRMESH_API float dihedralAngleSin(const MeshTopology &topology, const VertCoords &points, UndirectedEdgeId e)
MRMESH_API Vector< Vector3f, VertId > dirDblAreas(const MeshTopology &topology, const VertCoords &points, const VertBitSet *region=nullptr)
computes and returns the directed double area for every (region) vertex in the mesh
encodes a point on an edge of mesh or of polyline
Definition MREdgePoint.h:11
SegmPointf a
a in [0,1], a=0 => point is in org( e ), a=1 => point is in dest( e )
Definition MREdgePoint.h:13
EdgeId e
Definition MREdgePoint.h:12
Definition MRMesh/MRMeshTriPoint.h:23
EdgeId e
Definition MRMesh/MRMeshTriPoint.h:24
a point located on some mesh's face
Definition MRMesh/MRPointOnFace.h:11