24bool 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;
96 if (boundaryMethod != 2)
97 corners = neighbourhood.getBoundaryCorners(boundaryMethod, rangeInput, numberInput);
99 m_parameterPoints.reserve(N);
100 for (
size_t i = 1; i <= N; i++)
102 m_parameterPoints.push_back(Point2D(0, 0, i));
105 lengths = m_mesh.getCornerLengths(corners);
106 m_parameterPoints[n + corners[0] - 1] = Point2D(0, 0, n + corners[0]);
108 for (
size_t i = corners[0] + 1; i < corners[0] + B; i++)
110 w += halfedgeLengths[(i - 2) % B]
111 / findLengthOfPositionPart(i > B ? i - B : i, B, corners, lengths);
112 m_parameterPoints[(n + i - 1) > N - 1 ? n + i - 1 - B : n + i - 1] =
113 Neighbourhood::findPointOnBoundary(w, n + i > N ? n + i - B : n + i);
118 GISMO_ERROR(
"boundaryMethod not valid: " << boundaryMethod);
121 constructAndSolveEquationSystem(neighbourhood, n, N);
131 std::vector<T> lambdas;
133 b1.setZero(); b2.setZero();
135 for (
size_t i = 0; i < n; i++)
138 for (
size_t j = 0; j < n; j++)
140 A(i, j) = ( i==j ? (T)(1) : -lambdas[j] );
143 for (
size_t j = n; j < N; j++)
145 b1(i) += (lambdas[j]) * (m_parameterPoints[j][0]);
146 b2(i) += (lambdas[j]) * (m_parameterPoints[j][1]);
151 gsEigen::PartialPivLU<typename gsMatrix<T>::Base> LU = A.partialPivLu();
155 for (
size_t i = 0; i < n; i++)
156 m_parameterPoints[i] << u(i), v(i);
162 return m_parameterPoints[vertexIndex - 1];
169 for (
size_t i = 1; i <= m_mesh.getNumberOfVertices(); i++)
171 m.col(i - 1) << this->getParameterPoint(i)[0], this->getParameterPoint(i)[1];
180 for (
size_t i = 1; i <= m_mesh.getNumberOfVertices(); i++)
182 m.col(i - 1) << m_mesh.getVertex(i)->x(), m_mesh.getVertex(i)->y(), m_mesh.getVertex(i)->z();
191 mesh.reserve(3 * m_mesh.getNumberOfTriangles(), m_mesh.getNumberOfTriangles(), 0);
192 for (
size_t i = 0; i < m_mesh.getNumberOfTriangles(); i++)
195 for (
size_t j = 1; j <= 3; ++j)
197 v[j - 1] = mesh.addVertex(getParameterPoint(m_mesh.getGlobalVertexIndex(j, i))[0],
198 getParameterPoint(m_mesh.getGlobalVertexIndex(j, i))[1]);
200 mesh.addFace(v[0], v[1], v[2]);
211 for(
size_t i=0; i<m_mesh.numVertices(); i++)
213 size_t index = m_mesh.unsorted(i);
214 params.col(i) = getParameterPoint(index).transpose();
216 gsWriteParaview(m_mesh, filename, params);
222 m_options.update(list, gsOptionList::addIfUnknown);
229 calculate(m_options.getInt(
"boundaryMethod"),
230 m_options.getInt(
"parametrizationMethod"),
231 m_options.getMultiInt(
"corners"),
232 m_options.getReal(
"range"),
233 m_options.getInt(
"number"));
238 const size_t numberOfPositions,
239 const std::vector<index_t> &bounds,
240 const std::vector<T> &lengths)
243 GISMO_ASSERT(1 <= position && position <= numberOfPositions,
"The position " << position
244 <<
" is not a valid input. There are only " << numberOfPositions <<
" possible positions.");
245 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 "
246 << numberOfPositions <<
". ");
247 size_t numberOfBounds = bounds.size();
248 size_t s = lengths.size();
249 if (position > (
size_t)bounds[numberOfBounds - 1] || position <= (
size_t)bounds[0])
250 return lengths[s - 1];
251 for (
size_t i = 0; i < numberOfBounds; i++)
253 if (position - (
size_t)bounds[0] + 1 > (
size_t)bounds[i] - (
size_t)bounds[0] + 1
254 && position - (
size_t)bounds[0] + 1 <= (
size_t)bounds[(i + 1) % numberOfBounds] - (
size_t)bounds[0] + 1)
284 return m_localParametrizations[i].getLambdas();
290 std::vector<std::pair<T , size_t> > angles;
291 std::vector<index_t> corners;
292 angles.reserve(m_localBoundaryNeighbourhoods.size());
293 for(
typename std::vector<LocalNeighbourhood>::const_iterator it=m_localBoundaryNeighbourhoods.begin(); it!=m_localBoundaryNeighbourhoods.end(); it++)
295 angles.push_back(std::pair<T , size_t>(it->getInnerAngle(), it->getVertexIndex() - m_basicInfos.getNumberOfInnerVertices()));
297 std::sort(angles.begin(), angles.end());
300 this->takeCornersWithSmallestAngles(4, angles, corners);
301 std::sort(corners.begin(), corners.end());
302 gsDebug <<
"According to the method 'smallest inner angles' the following corners were chosen:\n";
303 for(std::vector<index_t>::iterator it=corners.begin(); it!=corners.end(); it++)
310 searchAreas(range, angles, corners);
311 gsDebug <<
"According to the method 'nearly opposite corners' the following corners were chosen:\n";
312 for(
size_t i=0; i<corners.size(); i++)
321 corners.push_back(angles.front().second);
322 angles.erase(angles.begin());
323 while(corners.size() < 4)
326 for(std::vector<index_t>::iterator it=corners.begin(); it!=corners.end(); it++)
328 if(m_basicInfos.getShortestBoundaryDistanceBetween(angles.front().second, *it) < range*m_basicInfos.getBoundaryLength())
332 corners.push_back(angles.front().second);
333 angles.erase(angles.begin());
335 std::sort(corners.begin(), corners.end());
336 for(
size_t i=0; i<corners.size(); i++)
345 std::vector<index_t> newCorners;
346 std::vector<T> lengths;
347 angles.erase(angles.begin()+number, angles.end());
349 for(
size_t i=0; i<angles.size(); i++)
351 gsDebug << angles[i].first <<
", " << angles[i].second <<
"\n";
353 newCorners.reserve((angles.size()*(angles.size()-1)*(angles.size()-2)*(angles.size()-3))/6);
354 corners.reserve((angles.size()*(angles.size()-1)*(angles.size()-2)*(angles.size()-3))/6);
355 for(
size_t i=0; i<angles.size(); i++)
357 for(
size_t j=i+1; j<angles.size(); j++)
359 for(
size_t k=j+1; k<angles.size(); k++)
361 for(
size_t l=k+1; l<angles.size(); l++)
363 newCorners.push_back(angles[i].second);
364 newCorners.push_back(angles[j].second);
365 newCorners.push_back(angles[k].second);
366 newCorners.push_back(angles[l].second);
367 std::sort(newCorners.begin(), newCorners.end());
368 lengths = m_basicInfos.getCornerLengths(newCorners);
369 std::sort(lengths.begin(), lengths.end());
370 newDifference = math::abs(lengths[0] - lengths[3]);
371 if(oldDifference == 0 || newDifference < oldDifference)
373 corners.erase(corners.begin(), corners.end());
374 corners.push_back(angles[i].second);
375 corners.push_back(angles[j].second);
376 corners.push_back(angles[k].second);
377 corners.push_back(angles[l].second);
378 std::sort(corners.begin(), corners.end());
380 newCorners.erase(newCorners.begin(), newCorners.end());
381 oldDifference = newDifference;
386 gsDebug <<
"According to the method 'evenly distributed corners' the following corners were chosen:\n";
387 for(
size_t i=0; i<corners.size(); i++)
400 return Point2D(w,0, vertexIndex);
402 return Point2D(1,w-(T)(1), vertexIndex);
404 return Point2D(T(1)-w+(T)(2),1, vertexIndex);
406 return Point2D(0,T(1)-w+(T)(3), vertexIndex);
419 sortedAngles.erase(sortedAngles.begin()+number, sortedAngles.end());
422 corners.reserve(sortedAngles.size());
423 for(
typename std::vector<std::pair<T, size_t> >::iterator it=sortedAngles.begin(); it!=sortedAngles.end(); it++)
424 corners.push_back(it->second);
428std::vector<T> gsParametrization<T>::Neighbourhood::midpoints(
const size_t numberOfCorners,
const T length)
const
430 std::vector<T> midpoints;
431 midpoints.reserve(numberOfCorners-1);
432 T n = 1./numberOfCorners;
433 for(
size_t i=1; i<numberOfCorners; i++)
435 midpoints.push_back(T(i)*length*n);
441void gsParametrization<T>::Neighbourhood::searchAreas(
const T range, std::vector<std::pair<T, size_t> >& sortedAngles, std::vector<index_t>& corners)
const
443 T l = m_basicInfos.getBoundaryLength();
444 std::vector<T> h = m_basicInfos.getBoundaryChordLengths();
445 this->takeCornersWithSmallestAngles(1,sortedAngles, corners);
446 std::vector<std::vector<std::pair<T , size_t> > > areas;
448 for(
size_t i=0; i<3; i++)
450 areas.push_back(std::vector<std::pair<T , size_t> >());
452 std::vector<T> midpoints = this->midpoints(4, l);
455 for(
size_t i=0; i<h.size(); i++)
457 walkAlong += h[(corners[0]+i-1)%h.size()];
458 for(
int j = 2; j>=0; j--)
460 if(math::abs(walkAlong-midpoints[j]) <= l*range)
462 areas[j].push_back(std::pair<T , size_t>(m_localBoundaryNeighbourhoods[(corners[0]+i)%(h.size())].getInnerAngle(), (corners[0]+i)%h.size() + 1));
467 std::sort(areas[0].begin(), areas[0].end());
468 std::sort(areas[1].begin(), areas[1].end());
469 std::sort(areas[2].begin(), areas[2].end());
470 bool smaller =
false;
472 for(
size_t i=0; i<areas[0].size(); i++)
474 if(areas[0][i].second > (
size_t)corners[0] || areas[0][i].second < (
size_t)corners[0])
476 corners.push_back(areas[0][i].second);
477 if(areas[0][i].second < (
size_t)corners[0])
484 for(
size_t i=0; i<areas[1].size(); i++)
488 if(areas[1][i].second > (
size_t)corners[1] && areas[1][i].second < (
size_t)corners[0])
490 corners.push_back(areas[1][i].second);
494 else if(areas[1][i].second > (
size_t)corners[1] || areas[1][i].second < (
size_t)corners[0])
496 corners.push_back(areas[1][i].second);
497 if(areas[1][i].second < (
size_t)corners[0])
504 for(
size_t i=0; i<areas[2].size(); i++)
508 if(areas[2][i].second > (
size_t)corners[2] && areas[2][i].second < (
size_t)corners[0])
510 corners.push_back(areas[2][i].second);
514 else if(areas[2][i].second > (
size_t)corners[2] || areas[2][i].second < (
size_t)corners[0])
516 corners.push_back(areas[2][i].second);
532 switch (parametrizationMethod)
536 std::list<T> angles = localNeighbourhood.
getAngles();
540 for(
typename std::list<T>::iterator it = angles.begin(); it!=angles.end(); ++it)
545 T length = (*meshInfo.
getVertex(indices.front()) - *meshInfo.
getVertex(m_vertexIndex)).norm();
546 Point2D nextPoint(length, 0, indices.front());
547 points.reserve(indices.size());
548 points.push_back(nextPoint);
551 T thetaInv = 1./theta;
553 while(!indices.empty())
555 length = (*meshInfo.
getVertex(indices.front()) - *meshInfo.
getVertex(m_vertexIndex)).norm();
557 nextAngle = angles.front()*thetaInv * (T)(2) * (T)(EIGEN_PI);
558 nextVector = (gsEigen::Rotation2D<T>(nextAngle).operator*(actualVector).normalized()*length) + p;
559 nextPoint =
Point2D(nextVector[0], nextVector[1], indices.front());
560 points.push_back(nextPoint);
561 actualVector = nextPoint - p;
572 m_lambdas.push_back(0);
574 while(!indices.empty())
576 m_lambdas[indices.front()-1] += (1./d);
583 T sumOfDistances = 0;
584 for(
typename std::list<T>::iterator it = neighbourDistances.begin(); it != neighbourDistances.end(); it++)
586 sumOfDistances += *it;
588 T sumOfDistancesInv = 1./sumOfDistances;
592 m_lambdas.push_back(0);
594 for(
typename std::list<T>::iterator it = neighbourDistances.begin(); it != neighbourDistances.end(); it++)
596 m_lambdas[indices.front()-1] += ((*it)*sumOfDistancesInv);
602 GISMO_ERROR(
"parametrizationMethod not valid: " << parametrizationMethod);
621 m_lambdas.reserve(N);
622 for(
size_t j=1; j <= N; j++)
624 m_lambdas.push_back(0);
627 size_t d = points.size();
628 std::vector<T> my(d, 0);
632 for(
typename VectorType::const_iterator it=points.begin(); it != points.end(); it++)
635 for(
size_t i=1; i < d-1; i++)
642 if(actualLine.
intersectSegment(*(points.begin()+steps), *(points.begin()+(steps+1)%d)))
647 matrix.topRows(2).col(0) = *it;
648 matrix.topRows(2).col(1) = *(points.begin()+steps);
649 matrix.topRows(2).col(2) = *(points.begin()+(steps+1)%d);
650 matrix.row(2).setOnes();
656 my[steps] = delta(1);
657 my[(steps + 1)%d] = delta(2);
661 for(
size_t k = 1; k <= d; k++)
663 m_lambdas[points[k-1].getVertexIndex()-1] += (my[k-1]);
665 std::fill(my.begin(), my.end(), 0);
668 for(
typename std::vector<T>::iterator it=m_lambdas.begin(); it != m_lambdas.end(); it++)
672 for(
typename std::vector<T>::iterator it=m_lambdas.begin(); it != m_lambdas.end(); it++)
687 "Vertex with index " << vertexIndex <<
" does either not exist (< 1) or is not an inner vertex (> "
691 m_vertexIndex = vertexIndex;
692 std::queue<typename gsHalfEdgeMesh<T>::Halfedge>
694 std::queue<typename gsHalfEdgeMesh<T>::Halfedge> nonFittingHalfedges;
695 m_neighbours.appendNextHalfedge(allHalfedges.front());
696 tmp = *meshInfo.
getVertex(allHalfedges.front().getOrigin()) - *meshInfo.
getVertex(m_vertexIndex);
697 m_angles.push_back(tmp.angle((*meshInfo.
getVertex(allHalfedges.front().getEnd())
699 m_neighbourDistances.push_back(allHalfedges.front().getLength());
701 while (!allHalfedges.empty())
703 if (m_neighbours.isAppendableAsNext(allHalfedges.front()))
705 m_neighbours.appendNextHalfedge(allHalfedges.front());
706 tmp = *meshInfo.
getVertex(allHalfedges.front().getOrigin()) - *meshInfo.
getVertex(m_vertexIndex);
708 .push_back(tmp.angle((*meshInfo.
getVertex(allHalfedges.front().getEnd())
710 m_neighbourDistances.push_back(allHalfedges.front().getLength());
712 while (!nonFittingHalfedges.empty())
714 allHalfedges.push(nonFittingHalfedges.front());
715 nonFittingHalfedges.pop();
718 else if (m_neighbours.isAppendableAsPrev(allHalfedges.front()))
720 m_neighbours.appendPrevHalfedge(allHalfedges.front());
721 tmp = *meshInfo.
getVertex(allHalfedges.front().getOrigin()) - *meshInfo.
getVertex(m_vertexIndex);
723 .push_front(tmp.angle((*meshInfo.
getVertex(allHalfedges.front().getEnd())
725 m_neighbourDistances.push_back(allHalfedges.front().getLength());
727 while (!nonFittingHalfedges.empty())
729 allHalfedges.push(nonFittingHalfedges.front());
730 nonFittingHalfedges.pop();
735 nonFittingHalfedges.push(allHalfedges.front());
744 return m_vertexIndex;
750 return m_neighbours.getNumberOfVertices();
756 return m_neighbours.getVertexIndices();
769 for(
typename std::list<T>::const_iterator it=m_angles.begin(); it!=m_angles.end(); it++)
779 return m_neighbourDistances;
gsHalfEdgeMesh is a gsMesh implementation that handles Halfedges
Definition gsHalfEdgeMesh.h:47
size_t getNumberOfVertices() const
Get number of vertices The number of vertices of the triangle mesh is returned.
Definition gsHalfEdgeMesh.hpp:58
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:190
size_t getNumberOfInnerVertices() const
Get number of inner vertices The number of inner vertices of the triangle mesh is returned.
Definition gsHalfEdgeMesh.hpp:70
const gsMesh< T >::gsVertexHandle & getVertex(const size_t vertexIndex) const
Get vertex The vertex with index 'vertexIndex' is returned.
Definition gsHalfEdgeMesh.hpp:82
Represents a line segment in d dimensions.
Definition gsLineSegment.h:22
bool intersectSegment(const gsPoint< d, T > &origin, const gsPoint< d, T > &end)
Tells wheter line intersects segment.
Definition gsLineSegment.h:40
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
Class Representing a triangle mesh with 3D vertices.
Definition gsMesh.h:32
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 which holds a list of parameters/options, and provides easy access to them.
Definition gsOptionList.h:33
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
void update(const gsOptionList &other, updateType type=ignoreIfUnknown)
Updates the object using the data from other.
Definition gsOptionList.cpp:253
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
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
Class that maintains the local neighbourhood properties.
Definition gsParametrization.h:128
LocalNeighbourhood(const gsHalfEdgeMesh< T > &meshInfo, const size_t vertexIndex, const bool innerVertex=1)
Constructor.
Definition gsParametrization.hpp:684
size_t getVertexIndex() const
Get vertex index.
Definition gsParametrization.hpp:742
size_t getNumberOfNeighbours() const
Get number of neighbours.
Definition gsParametrization.hpp:748
T getInnerAngle() const
Get inner angle.
Definition gsParametrization.hpp:766
std::list< T > getNeighbourDistances() const
Get neighbour distances.
Definition gsParametrization.hpp:777
const std::list< T > & getAngles() const
Get angles.
Definition gsParametrization.hpp:760
const std::list< size_t > getVertexIndicesOfNeighbours() const
Get vertex indices of neighbours.
Definition gsParametrization.hpp:754
Class maintains local parametrization This class represents a local parametrization for a point in th...
Definition gsParametrization.h:222
const std::vector< T > & getLambdas() const
Get lambdas The lambdas are returned.
Definition gsParametrization.hpp:607
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:527
void calculateLambdas(const size_t N, VectorType &points)
Calculate lambdas The lambdas according to Floater's algorithm are calculated.
Definition gsParametrization.hpp:619
Class that maintains neighbourhood information of triangle mesh. Represents the neighbourhood propert...
Definition gsParametrization.h:286
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:288
const std::vector< T > & getLambdas(const size_t i) const
Get vector of lambdas.
Definition gsParametrization.hpp:282
Neighbourhood(const gsHalfEdgeMesh< T > &meshInfo, const size_t parametrizationMethod=2)
Default constructor.
Definition gsParametrization.hpp:266
Class that maintains parametrization This class Parametrization stores the mesh information and the t...
Definition gsParametrization.h:47
virtual gsMesh< T > createFlatMesh() const
Definition gsParametrization.hpp:188
void writeTexturedMesh(std::string filename) const
Definition gsParametrization.hpp:207
void constructAndSolveEquationSystem(const Neighbourhood &neighbourhood, const size_t n, const size_t N)
Constructs linear equation system and solves it.
Definition gsParametrization.hpp:125
const Point2D & getParameterPoint(size_t vertexIndex) const
Get parameter point Returns the parameter point with given vertex index.
Definition gsParametrization.hpp:160
gsMatrix< T > createXYZmatrix()
Definition gsParametrization.hpp:177
virtual void compute()
Main function which performs the computation.
Definition gsParametrization.hpp:227
gsMatrix< T > createUVmatrix()
Definition gsParametrization.hpp:166
gsParametrization(const gsMesh< T > &mesh, const gsOptionList &list=defaultOptions())
Constructor using the input mesh and (possibly) options.
Definition gsParametrization.hpp:49
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:27
A fixed-size, statically allocated 3D vector.
Definition gsVector.h:219
A vector with arbitrary coefficient type and fixed or dynamic size.
Definition gsVector.h:37
gsVertex class that represents a 3D vertex for a gsMesh.
Definition gsVertex.h:27
#define gsDebug
Definition gsDebug.h:61
#define GISMO_ERROR(message)
Definition gsDebug.h:118
#define GISMO_UNUSED(x)
Definition gsDebug.h:112
#define gsInfo
Definition gsDebug.h:43
#define GISMO_ASSERT(cond, message)
Definition gsDebug.h:89
Provides declaration of Line class.
Provides a list of labeled parameters/options that can be set and accessed easily.
Class that maintains parametrization.
Provides declaration of functions writing Paraview files.
The G+Smo namespace, containing all definitions for the library.