netgen/libsrc/gprim/splinegeometry.cpp
Joachim Schoeberl 901bd944a2 move splines
2011-02-28 13:13:18 +00:00

135 lines
2.3 KiB
C++

/*
2d Spline curve for Mesh generator
*/
#include <mystdlib.h>
#include <linalg.hpp>
#include <gprim.hpp>
#include "splinegeometry.hpp"
namespace netgen
{
template<int D>
SplineGeometry<D> :: ~SplineGeometry()
{
for(int i = 0; i < splines.Size(); i++)
delete splines[i];
}
template<int D>
void SplineGeometry<D> :: GetRawData (Array<double> & raw_data) const
{
raw_data.Append(D);
// raw_data.Append(elto0);
raw_data.Append(splines.Size());
for(int i=0; i<splines.Size(); i++)
splines[i]->GetRawData(raw_data);
}
template<int D>
int SplineGeometry<D> :: Load (const Array<double> & raw_data, const int startpos)
{
int pos = startpos;
if(raw_data[pos] != D)
throw NgException("wrong dimension of spline raw_data");
pos++;
// elto0 = raw_data[pos]; pos++;
splines.SetSize(int(raw_data[pos]));
pos++;
Array< Point<D> > pts(3);
for(int i=0; i<splines.Size(); i++)
{
int type = int(raw_data[pos]);
pos++;
for(int j=0; j<type; j++)
for(int k=0; k<D; k++)
{
pts[j](k) = raw_data[pos];
pos++;
}
if (type == 2)
{
splines[i] = new LineSeg<D>(GeomPoint<D>(pts[0],1),
GeomPoint<D>(pts[1],1));
}
else if (type == 3)
{
splines[i] = new SplineSeg3<D>(GeomPoint<D>(pts[0],1),
GeomPoint<D>(pts[1],1),
GeomPoint<D>(pts[2],1));
}
else
throw NgException("something wrong with spline raw data");
}
return pos;
}
template<int D>
void SplineGeometry<D> :: GetBoundingBox (Box<D> & box) const
{
if (!splines.Size())
{
Point<D> auxp = 0.;
box.Set (auxp);
return;
}
Array<Point<D> > points;
for (int i = 0; i < splines.Size(); i++)
{
splines[i]->GetPoints (20, points);
if (i == 0) box.Set(points[0]);
for (int j = 0; j < points.Size(); j++)
box.Add (points[j]);
}
}
/*
template<int D>
void SplineGeometry<D> :: SetGrading (const double grading)
{
elto0 = grading;
}
*/
template<int D>
void SplineGeometry<D> :: AppendPoint (const Point<D> & p, const double reffac, const bool hpref)
{
geompoints.Append (GeomPoint<D>(p, reffac));
geompoints.Last().hpref = hpref;
}
template class SplineGeometry<2>;
template class SplineGeometry<3>;
}