Skip to content

Commit 26df22c

Browse files
committed
parametric curves: add interpolated order
1 parent 8e35d9e commit 26df22c

File tree

5 files changed

+44
-38
lines changed

5 files changed

+44
-38
lines changed

include/fitpack_core_c.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,24 @@ FP_FLAG parder_c(const FP_REAL* tx, FP_SIZE nx, const FP_REAL* ty, FP_SIZE ny, c
245245

246246
#endif
247247

248+
// Core C++ functions
248249
#ifdef __cplusplus
249-
typedef vector<FP_REAL> fpPoint;
250+
251+
typedef vector<FP_REAL> fpPoint;
252+
253+
// Flatten a 2D vector
254+
inline vector<FP_REAL> flatten_2d_vector(const vector<fpPoint>& x2d) {
255+
FP_SIZE ndim = 0;
256+
for (const auto& p : x2d) ndim = std::max(ndim, static_cast<FP_SIZE>(p.size()));
257+
258+
vector<FP_REAL> x(x2d.size() * ndim, 0.0);
259+
for (FP_SIZE i = 0; i < x2d.size(); i++)
260+
copy(x2d[i].begin(), x2d[i].end(), x.begin() + i * ndim);
261+
262+
return x;
263+
}
264+
265+
250266
#endif
251267

252268
#endif // FITPACK_CORE_C_H_INCLUDED

include/fitpack_parametric_curves_c.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void fitpack_parametric_curve_c_new_points (fitpack_parametric_cur
5050
void fitpack_parametric_curve_c_set_default_parameters(fitpack_parametric_curve_c *self);
5151
FP_FLAG fitpack_parametric_curve_c_new_fit (fitpack_parametric_curve_c *self, FP_SIZE ndim, FP_SIZE npts, FP_REAL* x, FP_REAL* u, FP_REAL* w, FP_REAL* smoothing, FP_SIZE* order);
5252
FP_FLAG fitpack_parametric_curve_c_fit (fitpack_parametric_curve_c *self, FP_REAL* smoothing, FP_SIZE* order);
53-
FP_FLAG fitpack_parametric_curve_c_interpolating (fitpack_parametric_curve_c *self);
53+
FP_FLAG fitpack_parametric_curve_c_interpolating (fitpack_parametric_curve_c *self, FP_SIZE* order);
5454
FP_FLAG fitpack_parametric_curve_c_eval_one (fitpack_parametric_curve_c *self, FP_REAL u, FP_REAL* y);
5555
//FP_REAL fitpack_parametric_curve_c_integral (fitpack_parametric_curve_c *self, FP_REAL from, FP_REAL to);
5656
//void fitpack_parametric_curve_c_fourier (fitpack_parametric_curve_c *self, FP_SIZE nparm, const FP_REAL* alpha, FP_REAL* A, FP_REAL* B, FP_FLAG* ierr);

include/fpParametricCurve.hpp

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,6 @@
2929
#include <vector>
3030
using std::vector;
3131

32-
// Flatten a 2D vector
33-
vector<FP_REAL> flatten_2d_vector(vector<fpPoint> x2d)
34-
{
35-
36-
// Get number of points
37-
FP_SIZE npts = x2d.size();
38-
39-
// Get max vector size
40-
FP_SIZE ndim = 0;
41-
for (FP_SIZE i=0; i<x2d.size(); i++)
42-
{
43-
ndim = x2d[i].size()>ndim? x2d[i].size() : ndim;
44-
}
45-
46-
// Allocate flattened vector
47-
FP_SIZE n = npts*ndim;
48-
49-
vector<FP_REAL> x(n,0.0);
50-
51-
for (FP_SIZE pt=0; pt<x2d.size(); pt++)
52-
{
53-
for (FP_SIZE idim=0; idim<x2d[pt].size(); idim++)
54-
{
55-
x[pt*ndim+idim] = x2d[pt][idim];
56-
}
57-
}
58-
59-
return x;
60-
61-
}
62-
6332
class fpParametricCurve
6433
{
6534
public:
@@ -110,7 +79,8 @@ class fpParametricCurve
11079
FP_FLAG fit(FP_REAL smoothing, FP_SIZE order) { return fitpack_parametric_curve_c_fit(&cptr,&smoothing,&order); }
11180

11281
// Get the interpolating fit
113-
FP_FLAG interpolate() { return fitpack_parametric_curve_c_interpolating(&cptr); }
82+
FP_FLAG interpolate() { return fitpack_parametric_curve_c_interpolating(&cptr,nullptr); }
83+
FP_FLAG interpolate(FP_SIZE order) { return fitpack_parametric_curve_c_interpolating(&cptr,nullptr); }
11484

11585
// Fit properties
11686
const FP_SIZE degree () { return fitpack_parametric_curve_c_degree(&cptr); };
@@ -148,6 +118,21 @@ class fpParametricCurve
148118

149119
}
150120

121+
// Get values at a range of parameter values
122+
vector<fpPoint> eval(FP_REAL umin, FP_REAL umax, FP_SIZE npts = 100, FP_SIZE* ierr=nullptr)
123+
{
124+
vector<FP_REAL> uu(npts);
125+
126+
// Generate linearly spaced u values
127+
FP_REAL du = (umax - umin) / (npts - 1);
128+
for (FP_SIZE i = 0; i < npts; ++i) {
129+
uu[i] = umin + i * du;
130+
}
131+
132+
return eval(uu,ierr);
133+
134+
}
135+
151136
// Get single derivative at u
152137
fpPoint ddu(FP_REAL u, FP_SIZE order, FP_FLAG* ierr=nullptr)
153138
{

src/fitpack_parametric.f90

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,11 +437,15 @@ function curve_eval_many(this,u,ierr) result(x)
437437
end function curve_eval_many
438438

439439
! Interpolating curve
440-
integer function interpolating_curve(this) result(ierr)
440+
integer function interpolating_curve(this,order) result(ierr)
441441
class(fitpack_parametric_curve), intent(inout) :: this
442+
integer(FP_SIZE), optional, intent(in) :: order
443+
444+
! Set zero smoothing
445+
this%iopt = IOPT_NEW_SMOOTHING
442446

443447
! Set zero smoothing
444-
ierr = curve_fit_automatic_knots(this,zero)
448+
ierr = curve_fit_automatic_knots(this,smoothing=zero,order=order)
445449

446450
end function interpolating_curve
447451

src/fitpack_parametric_c.f90

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,16 +222,17 @@ integer(FP_FLAG) function fitpack_parametric_curve_c_fit(this,smoothing,order) r
222222
end function fitpack_parametric_curve_c_fit
223223

224224
!> Wrapper to interpolating_curve
225-
integer(FP_FLAG) function fitpack_parametric_curve_c_interpolating(this) result(ierr) &
225+
integer(FP_FLAG) function fitpack_parametric_curve_c_interpolating(this,order) result(ierr) &
226226
bind(c,name='fitpack_parametric_curve_c_interpolating')
227227
type(fitpack_parametric_curve_c), intent(inout) :: this
228+
integer(FP_SIZE), optional, intent(in) :: order
228229

229230
type(fitpack_parametric_curve), pointer :: fcurve
230231

231232
!> Get object; allocate it in case
232233
call fitpack_parametric_curve_c_pointer(this, fcurve)
233234

234-
ierr = fcurve%interpolate()
235+
ierr = fcurve%interpolate(order)
235236

236237
end function fitpack_parametric_curve_c_interpolating
237238

0 commit comments

Comments
 (0)