24 bool gsParametrization<T>::rangeCheck(
const std::vector<index_t> &corners,
const size_t minimum,
const size_t maximum)
26 for (std::vector<index_t>::const_iterator it = corners.begin(); it != corners.end(); it++)
28 if ((
size_t)*it < minimum || (size_t)*it > maximum)
38 opt.
addInt(
"boundaryMethod",
"boundary methodes: {1:chords, 2:corners, 3:smallest, 4:restrict, 5:opposite, 6:distributed}", 4);
39 opt.
addInt(
"parametrizationMethod",
"parametrization methods: {1:shape, 2:uniform, 3:distance}", 1);
40 std::vector<index_t> corners;
41 opt.
addMultiInt(
"corners",
"vector for corners", corners);
42 opt.
addReal(
"range",
"in case of restrict or opposite", 0.1);
43 opt.
addInt(
"number",
"number of corners, in case of corners", 4);
44 opt.
addReal(
"precision",
"precision to calculate", 1E-8);
51 m_options.
update(list, gsOptionList::addIfUnknown);
56 const size_t paraMethod,
57 const std::vector<index_t> &cornersInput,
59 const size_t numberInput)
62 "The boundary method " << boundaryMethod <<
" is not valid.");
63 GISMO_ASSERT(paraMethod >= 1 && paraMethod <= 3,
"The parametrization method " << paraMethod <<
" is not valid.");
64 size_t n = m_mesh.getNumberOfInnerVertices();
65 size_t N = m_mesh.getNumberOfVertices();
66 size_t B = m_mesh.getNumberOfBoundaryVertices();
67 Neighbourhood neighbourhood(m_mesh, paraMethod);
70 std::vector<T> halfedgeLengths = m_mesh.getBoundaryChordLengths();
71 std::vector<index_t> corners;
72 std::vector<T> lengths;
74 switch (boundaryMethod)
77 m_parameterPoints.reserve(n + B);
78 for (
size_t i = 1; i <= n + 1; i++)
80 m_parameterPoints.push_back(Point2D(0, 0, i));
82 for (
size_t i = 0; i < B - 1; i++)
84 w += halfedgeLengths[i] * (T(1) / m_mesh.getBoundaryLength()) * (T)(4);
85 m_parameterPoints.push_back(Neighbourhood::findPointOnBoundary(w, n + i + 2));
89 corners = cornersInput;
94 if (boundaryMethod != 2)
95 corners = neighbourhood.getBoundaryCorners(boundaryMethod, rangeInput, numberInput);
97 m_parameterPoints.reserve(N);
98 for (
size_t i = 1; i <= N; i++)
100 m_parameterPoints.push_back(Point2D(0, 0, i));
103 lengths = m_mesh.getCornerLengths(corners);
104 m_parameterPoints[n + corners[0] - 1] = Point2D(0, 0, n + corners[0]);
106 for (
size_t i = corners[0] + 1; i < corners[0] + B; i++)
108 w += halfedgeLengths[(i - 2) % B]
109 / findLengthOfPositionPart(i > B ? i - B : i, B, corners, lengths);
110 m_parameterPoints[(n + i - 1) > N - 1 ? n + i - 1 - B : n + i - 1] =
111 Neighbourhood::findPointOnBoundary(w, n + i > N ? n + i - B : n + i);
115 GISMO_ERROR(
"boundaryMethod not valid: " << boundaryMethod);
118 constructAndSolveEquationSystem(neighbourhood, n, N);
128 std::vector<T> lambdas;
130 b1.setZero(); b2.setZero();
132 for (
size_t i = 0; i < n; i++)
135 for (
size_t j = 0; j < n; j++)
137 A(i, j) = ( i==j ? (T)(1) : -lambdas[j] );
140 for (
size_t j = n; j < N; j++)
142 b1(i) += (lambdas[j]) * (m_parameterPoints[j][0]);
143 b2(i) += (lambdas[j]) * (m_parameterPoints[j][1]);
148 gsEigen::PartialPivLU<typename gsMatrix<T>::Base> LU = A.partialPivLu();
152 for (
size_t i = 0; i < n; i++)
153 m_parameterPoints[i] << u(i), v(i);
159 return m_parameterPoints[vertexIndex - 1];
166 for (
size_t i = 1; i <= m_mesh.getNumberOfVertices(); i++)
168 m.col(i - 1) << this->getParameterPoint(i)[0], this->getParameterPoint(i)[1];
177 for (
size_t i = 1; i <= m_mesh.getNumberOfVertices(); i++)
179 m.col(i - 1) << m_mesh.getVertex(i)->x(), m_mesh.getVertex(i)->y(), m_mesh.getVertex(i)->z();
188 mesh.reserve(3 * m_mesh.getNumberOfTriangles(), m_mesh.getNumberOfTriangles(), 0);
189 for (
size_t i = 0; i < m_mesh.getNumberOfTriangles(); i++)
192 for (
size_t j = 1; j <= 3; ++j)
194 v[j - 1] = mesh.addVertex(getParameterPoint(m_mesh.getGlobalVertexIndex(j, i))[0],
195 getParameterPoint(m_mesh.getGlobalVertexIndex(j, i))[1]);
197 mesh.addFace(v[0], v[1], v[2]);
208 for(
size_t i=0; i<m_mesh.numVertices(); i++)
210 size_t index = m_mesh.unsorted(i);
211 params.col(i) = getParameterPoint(index).transpose();
213 gsWriteParaview(m_mesh, filename, params);
219 m_options.update(list, gsOptionList::addIfUnknown);
226 calculate(m_options.getInt(
"boundaryMethod"),
227 m_options.getInt(
"parametrizationMethod"),
228 m_options.getMultiInt(
"corners"),
229 m_options.getReal(
"range"),
230 m_options.getInt(
"number"));
235 const size_t numberOfPositions,
236 const std::vector<index_t> &bounds,
237 const std::vector<T> &lengths)
240 GISMO_ASSERT(1 <= position && position <= numberOfPositions,
"The position " << position
241 <<
" is not a valid input. There are only " << numberOfPositions <<
" possible positions.");
242 GISMO_ASSERT(rangeCheck(bounds, 1, numberOfPositions),
"The bounds are not a valid input. They have to be out of the possible positions, which only are "
243 << numberOfPositions <<
". ");
244 size_t numberOfBounds = bounds.size();
245 size_t s = lengths.size();
246 if (position > (
size_t)bounds[numberOfBounds - 1] || position <= (
size_t)bounds[0])
247 return lengths[s - 1];
248 for (
size_t i = 0; i < numberOfBounds; i++)
250 if (position - (
size_t)bounds[0] + 1 > (
size_t)bounds[i] - (
size_t)bounds[0] + 1
251 && position - (
size_t)bounds[0] + 1 <= (
size_t)bounds[(i + 1) % numberOfBounds] - (
size_t)bounds[0] + 1)
281 return m_localParametrizations[i].getLambdas();
287 std::vector<std::pair<T , size_t> > angles;
288 std::vector<index_t> corners;
289 angles.reserve(m_localBoundaryNeighbourhoods.size());
290 for(
typename std::vector<LocalNeighbourhood>::const_iterator it=m_localBoundaryNeighbourhoods.begin(); it!=m_localBoundaryNeighbourhoods.end(); it++)
292 angles.push_back(std::pair<T , size_t>(it->getInnerAngle(), it->getVertexIndex() - m_basicInfos.getNumberOfInnerVertices()));
294 std::sort(angles.begin(), angles.end());
297 this->takeCornersWithSmallestAngles(4, angles, corners);
298 std::sort(corners.begin(), corners.end());
299 gsDebug <<
"According to the method 'smallest inner angles' the following corners were chosen:\n";
300 for(std::vector<index_t>::iterator it=corners.begin(); it!=corners.end(); it++)
302 gsDebug << (*it) <<
"\n";
307 searchAreas(range, angles, corners);
308 gsDebug <<
"According to the method 'nearly opposite corners' the following corners were chosen:\n";
309 for(
size_t i=0; i<corners.size(); i++)
318 corners.push_back(angles.front().second);
319 angles.erase(angles.begin());
320 while(corners.size() < 4)
323 for(std::vector<index_t>::iterator it=corners.begin(); it!=corners.end(); it++)
325 if(m_basicInfos.getShortestBoundaryDistanceBetween(angles.front().second, *it) < range*m_basicInfos.getBoundaryLength())
329 corners.push_back(angles.front().second);
330 angles.erase(angles.begin());
332 std::sort(corners.begin(), corners.end());
333 for(
size_t i=0; i<corners.size(); i++)
342 std::vector<index_t> newCorners;
343 std::vector<T> lengths;
344 angles.erase(angles.begin()+number, angles.end());
346 for(
size_t i=0; i<angles.size(); i++)
348 gsDebug << angles[i].first <<
", " << angles[i].second <<
"\n";
350 newCorners.reserve((angles.size()*(angles.size()-1)*(angles.size()-2)*(angles.size()-3))/6);
351 corners.reserve((angles.size()*(angles.size()-1)*(angles.size()-2)*(angles.size()-3))/6);
352 for(
size_t i=0; i<angles.size(); i++)
354 for(
size_t j=i+1; j<angles.size(); j++)
356 for(
size_t k=j+1; k<angles.size(); k++)
358 for(
size_t l=k+1; l<angles.size(); l++)
360 newCorners.push_back(angles[i].second);
361 newCorners.push_back(angles[j].second);
362 newCorners.push_back(angles[k].second);
363 newCorners.push_back(angles[l].second);
364 std::sort(newCorners.begin(), newCorners.end());
365 lengths = m_basicInfos.getCornerLengths(newCorners);
366 std::sort(lengths.begin(), lengths.end());
367 newDifference =
math::abs(lengths[0] - lengths[3]);
368 if(oldDifference == 0 || newDifference < oldDifference)
370 corners.erase(corners.begin(), corners.end());
371 corners.push_back(angles[i].second);
372 corners.push_back(angles[j].second);
373 corners.push_back(angles[k].second);
374 corners.push_back(angles[l].second);
375 std::sort(corners.begin(), corners.end());
377 newCorners.erase(newCorners.begin(), newCorners.end());
378 oldDifference = newDifference;
383 gsDebug <<
"According to the method 'evenly distributed corners' the following corners were chosen:\n";
384 for(
size_t i=0; i<corners.size(); i++)
397 return Point2D(w,0, vertexIndex);
399 return Point2D(1,w-(T)(1), vertexIndex);
401 return Point2D(T(1)-w+(T)(2),1, vertexIndex);
403 return Point2D(0,T(1)-w+(T)(3), vertexIndex);
416 sortedAngles.erase(sortedAngles.begin()+number, sortedAngles.end());
419 corners.reserve(sortedAngles.size());
420 for(
typename std::vector<std::pair<T, size_t> >::iterator it=sortedAngles.begin(); it!=sortedAngles.end(); it++)
421 corners.push_back(it->second);
425 std::vector<T> gsParametrization<T>::Neighbourhood::midpoints(
const size_t numberOfCorners,
const T length)
const
427 std::vector<T> midpoints;
428 midpoints.reserve(numberOfCorners-1);
429 T n = 1./numberOfCorners;
430 for(
size_t i=1; i<numberOfCorners; i++)
432 midpoints.push_back(T(i)*length*n);
438 void gsParametrization<T>::Neighbourhood::searchAreas(
const T range, std::vector<std::pair<T, size_t> >& sortedAngles, std::vector<index_t>& corners)
const
440 T l = m_basicInfos.getBoundaryLength();
441 std::vector<T> h = m_basicInfos.getBoundaryChordLengths();
442 this->takeCornersWithSmallestAngles(1,sortedAngles, corners);
443 std::vector<std::vector<std::pair<T , size_t> > > areas;
445 for(
size_t i=0; i<3; i++)
447 areas.push_back(std::vector<std::pair<T , size_t> >());
449 std::vector<T> midpoints = this->midpoints(4, l);
452 for(
size_t i=0; i<h.size(); i++)
454 walkAlong += h[(corners[0]+i-1)%h.size()];
455 for(
int j = 2; j>=0; j--)
457 if(
math::abs(walkAlong-midpoints[j]) <= l*range)
459 areas[j].push_back(std::pair<T , size_t>(m_localBoundaryNeighbourhoods[(corners[0]+i)%(h.size())].getInnerAngle(), (corners[0]+i)%h.size() + 1));
464 std::sort(areas[0].begin(), areas[0].end());
465 std::sort(areas[1].begin(), areas[1].end());
466 std::sort(areas[2].begin(), areas[2].end());
467 bool smaller =
false;
469 for(
size_t i=0; i<areas[0].size(); i++)
471 if(areas[0][i].second > (
size_t)corners[0] || areas[0][i].second < (size_t)corners[0])
473 corners.push_back(areas[0][i].second);
474 if(areas[0][i].second < (
size_t)corners[0])
481 for(
size_t i=0; i<areas[1].size(); i++)
485 if(areas[1][i].second > (
size_t)corners[1] && areas[1][i].second < (size_t)corners[0])
487 corners.push_back(areas[1][i].second);
491 else if(areas[1][i].second > (
size_t)corners[1] || areas[1][i].second < (
size_t)corners[0])
493 corners.push_back(areas[1][i].second);
494 if(areas[1][i].second < (
size_t)corners[0])
501 for(
size_t i=0; i<areas[2].size(); i++)
505 if(areas[2][i].second > (
size_t)corners[2] && areas[2][i].second < (size_t)corners[0])
507 corners.push_back(areas[2][i].second);
511 else if(areas[2][i].second > (
size_t)corners[2] || areas[2][i].second < (
size_t)corners[0])
513 corners.push_back(areas[2][i].second);
529 switch (parametrizationMethod)
533 std::list<T> angles = localNeighbourhood.
getAngles();
537 for(
typename std::list<T>::iterator it = angles.begin(); it!=angles.end(); ++it)
542 T length = (*meshInfo.
getVertex(indices.front()) - *meshInfo.
getVertex(m_vertexIndex)).norm();
543 Point2D nextPoint(length, 0, indices.front());
544 points.reserve(indices.size());
545 points.push_back(nextPoint);
548 T thetaInv = 1./theta;
550 while(!indices.empty())
552 length = (*meshInfo.
getVertex(indices.front()) - *meshInfo.
getVertex(m_vertexIndex)).norm();
554 nextAngle = angles.front()*thetaInv * (T)(2) * (T)(EIGEN_PI);
555 nextVector = (gsEigen::Rotation2D<T>(nextAngle).
operator*(actualVector).normalized()*length) + p;
556 nextPoint =
Point2D(nextVector[0], nextVector[1], indices.front());
557 points.push_back(nextPoint);
558 actualVector = nextPoint - p;
569 m_lambdas.push_back(0);
571 while(!indices.empty())
573 m_lambdas[indices.front()-1] += (1./d);
580 T sumOfDistances = 0;
581 for(
typename std::list<T>::iterator it = neighbourDistances.begin(); it != neighbourDistances.end(); it++)
583 sumOfDistances += *it;
585 T sumOfDistancesInv = 1./sumOfDistances;
589 m_lambdas.push_back(0);
591 for(
typename std::list<T>::iterator it = neighbourDistances.begin(); it != neighbourDistances.end(); it++)
593 m_lambdas[indices.front()-1] += ((*it)*sumOfDistancesInv);
599 GISMO_ERROR(
"parametrizationMethod not valid: " << parametrizationMethod);
618 m_lambdas.reserve(N);
619 for(
size_t j=1; j <= N; j++)
621 m_lambdas.push_back(0);
624 size_t d = points.size();
625 std::vector<T> my(d, 0);
629 for(
typename VectorType::const_iterator it=points.begin(); it != points.end(); it++)
632 for(
size_t i=1; i < d-1; i++)
639 if(actualLine.
intersectSegment(*(points.begin()+steps), *(points.begin()+(steps+1)%d)))
644 matrix.topRows(2).col(0) = *it;
645 matrix.topRows(2).col(1) = *(points.begin()+steps);
646 matrix.topRows(2).col(2) = *(points.begin()+(steps+1)%d);
647 matrix.row(2).setOnes();
653 my[steps] = delta(1);
654 my[(steps + 1)%d] = delta(2);
658 for(
size_t k = 1; k <= d; k++)
660 m_lambdas[points[k-1].getVertexIndex()-1] += (my[k-1]);
662 std::fill(my.begin(), my.end(), 0);
665 for(
typename std::vector<T>::iterator it=m_lambdas.begin(); it != m_lambdas.end(); it++)
669 for(
typename std::vector<T>::iterator it=m_lambdas.begin(); it != m_lambdas.end(); it++)
684 "Vertex with index " << vertexIndex <<
" does either not exist (< 1) or is not an inner vertex (> "
688 m_vertexIndex = vertexIndex;
689 std::queue<typename gsHalfEdgeMesh<T>::Halfedge>
691 std::queue<typename gsHalfEdgeMesh<T>::Halfedge> nonFittingHalfedges;
692 m_neighbours.appendNextHalfedge(allHalfedges.front());
693 tmp = *meshInfo.
getVertex(allHalfedges.front().getOrigin()) - *meshInfo.
getVertex(m_vertexIndex);
694 m_angles.push_back(tmp.angle((*meshInfo.
getVertex(allHalfedges.front().getEnd())
696 m_neighbourDistances.push_back(allHalfedges.front().getLength());
698 while (!allHalfedges.empty())
700 if (m_neighbours.isAppendableAsNext(allHalfedges.front()))
702 m_neighbours.appendNextHalfedge(allHalfedges.front());
703 tmp = *meshInfo.
getVertex(allHalfedges.front().getOrigin()) - *meshInfo.
getVertex(m_vertexIndex);
705 .push_back(tmp.angle((*meshInfo.
getVertex(allHalfedges.front().getEnd())
707 m_neighbourDistances.push_back(allHalfedges.front().getLength());
709 while (!nonFittingHalfedges.empty())
711 allHalfedges.push(nonFittingHalfedges.front());
712 nonFittingHalfedges.pop();
715 else if (m_neighbours.isAppendableAsPrev(allHalfedges.front()))
717 m_neighbours.appendPrevHalfedge(allHalfedges.front());
718 tmp = *meshInfo.
getVertex(allHalfedges.front().getOrigin()) - *meshInfo.
getVertex(m_vertexIndex);
720 .push_front(tmp.angle((*meshInfo.
getVertex(allHalfedges.front().getEnd())
722 m_neighbourDistances.push_back(allHalfedges.front().getLength());
724 while (!nonFittingHalfedges.empty())
726 allHalfedges.push(nonFittingHalfedges.front());
727 nonFittingHalfedges.pop();
732 nonFittingHalfedges.push(allHalfedges.front());
741 return m_vertexIndex;
747 return m_neighbours.getNumberOfVertices();
753 return m_neighbours.getVertexIndices();
766 for(
typename std::list<T>::const_iterator it=m_angles.begin(); it!=m_angles.end(); it++)
776 return m_neighbourDistances;
Class that maintains parametrization This class Parametrization stores the mesh information and the t...
Definition: gsParametrization.h:46
const std::list< T > & getAngles() const
Get angles.
Definition: gsParametrization.hpp:757
A fixed-size, statically allocated 3D vector.
Definition: gsVector.h:218
const std::queue< Halfedge > getOppositeHalfedges(const size_t vertexIndex, const bool innerVertex=1) const
Returns queue of all opposite halfedges of vertex The opposite halfedge of a point in a triangle is m...
Definition: gsHalfEdgeMesh.hpp:189
Class that maintains neighbourhood information of triangle mesh. Represents the neighbourhood propert...
Definition: gsParametrization.h:285
size_t getVertexIndex() const
Get vertex index.
Definition: gsParametrization.hpp:739
#define gsDebug
Definition: gsDebug.h:61
void addMultiInt(const std::string &label, const std::string &desc, const std::vector< index_t > &values)
Adds an option-group gn containing values of a std::vector.
Definition: gsOptionList.cpp:221
const Point2D & getParameterPoint(size_t vertexIndex) const
Get parameter point Returns the parameter point with given vertex index.
Definition: gsParametrization.hpp:157
const std::vector< T > & getLambdas() const
Get lambdas The lambdas are returned.
Definition: gsParametrization.hpp:604
void writeTexturedMesh(std::string filename) const
Definition: gsParametrization.hpp:204
T getInnerAngle() const
Get inner angle.
Definition: gsParametrization.hpp:763
Class that maintains the local neighbourhood properties.
Definition: gsParametrization.h:127
bool intersectSegment(const gsPoint< d, T > &origin, const gsPoint< d, T > &end)
Tells wheter line intersects segment.
Definition: gsLineSegment.h:40
gsMatrix< T > createUVmatrix()
Definition: gsParametrization.hpp:163
Provides declaration of functions writing Paraview files.
std::list< T > getNeighbourDistances() const
Get neighbour distances.
Definition: gsParametrization.hpp:774
#define GISMO_ASSERT(cond, message)
Definition: gsDebug.h:89
size_t getNumberOfInnerVertices() const
Get number of inner vertices The number of inner vertices of the triangle mesh is returned...
Definition: gsHalfEdgeMesh.hpp:69
LocalParametrization(const gsHalfEdgeMesh< T > &meshInfo, const LocalNeighbourhood &localNeighbourhood, const size_t parametrizationMethod=2)
Constructor Using this constructor one needs to input mesh information, a local neighbourhood and a p...
Definition: gsParametrization.hpp:524
void calculateLambdas(const size_t N, VectorType &points)
Calculate lambdas The lambdas according to Floater's algorithm are calculated.
Definition: gsParametrization.hpp:616
virtual gsMesh< T > createFlatMesh() const
Definition: gsParametrization.hpp:185
const std::list< size_t > getVertexIndicesOfNeighbours() const
Get vertex indices of neighbours.
Definition: gsParametrization.hpp:751
void addInt(const std::string &label, const std::string &desc, const index_t &value)
Adds a option named label, with description desc and value value.
Definition: gsOptionList.cpp:201
Class Representing a triangle mesh with 3D vertices.
Definition: gsMesh.h:31
Provides a list of labeled parameters/options that can be set and accessed easily.
size_t getNumberOfVertices() const
Get number of vertices The number of vertices of the triangle mesh is returned.
Definition: gsHalfEdgeMesh.hpp:57
gsMesh & cleanMesh()
reorders the vertices of all faces of an .stl mesh, such that only 1 vertex is used instead of #(adja...
Definition: gsMesh.hpp:250
Class maintains local parametrization This class represents a local parametrization for a point in th...
Definition: gsParametrization.h:221
const std::vector< T > & getLambdas(const size_t i) const
Get vector of lambdas.
Definition: gsParametrization.hpp:279
#define gsInfo
Definition: gsDebug.h:43
gsMatrix< T > createXYZmatrix()
Definition: gsParametrization.hpp:174
Class that maintains parametrization.
Neighbourhood(const gsHalfEdgeMesh< T > &meshInfo, const size_t parametrizationMethod=2)
Default constructor.
Definition: gsParametrization.hpp:263
void update(const gsOptionList &other, updateType type=ignoreIfUnknown)
Updates the object using the data from other.
Definition: gsOptionList.cpp:253
const gsMesh< T >::gsVertexHandle & getVertex(const size_t vertexIndex) const
Get vertex The vertex with index 'vertexIndex' is returned.
Definition: gsHalfEdgeMesh.hpp:81
static gsOptionList defaultOptions()
Returns the list of default options for gsParametrization.
Definition: gsParametrization.hpp:35
A Point in T^d, with an index number.
Definition: gsPoint.h:26
Provides declaration of Line class.
void addReal(const std::string &label, const std::string &desc, const Real &value)
Adds a option named label, with description desc and value value.
Definition: gsOptionList.cpp:211
#define GISMO_UNUSED(x)
Definition: gsDebug.h:112
LocalNeighbourhood(const gsHalfEdgeMesh< T > &meshInfo, const size_t vertexIndex, const bool innerVertex=1)
Constructor.
Definition: gsParametrization.hpp:681
void constructAndSolveEquationSystem(const Neighbourhood &neighbourhood, const size_t n, const size_t N)
Constructs linear equation system and solves it.
Definition: gsParametrization.hpp:122
#define GISMO_ERROR(message)
Definition: gsDebug.h:118
const std::vector< index_t > getBoundaryCorners(const size_t method, const T range=0.1, const size_t number=4) const
Get boundary corners depending on the method.
Definition: gsParametrization.hpp:285
EIGEN_STRONG_INLINE abs_expr< E > abs(const E &u)
Absolute value.
Definition: gsExpressions.h:4486
Represents a line segment in d dimensions.
Definition: gsLineSegment.h:21
Class which holds a list of parameters/options, and provides easy access to them. ...
Definition: gsOptionList.h:32
virtual void compute()
Main function which performs the computation.
Definition: gsParametrization.hpp:224
gsHalfEdgeMesh is a gsMesh implementation that handles Halfedges
Definition: gsHalfEdgeMesh.h:46
size_t getNumberOfNeighbours() const
Get number of neighbours.
Definition: gsParametrization.hpp:745
gsParametrization(const gsMesh< T > &mesh, const gsOptionList &list=defaultOptions())
Constructor using the input mesh and (possibly) options.
Definition: gsParametrization.hpp:49
gsVertex class that represents a 3D vertex for a gsMesh.
Definition: gsVertex.h:26