use warnings;
use strict;
use feature ':5.10';
my @accel = ([-0.7437,0.1118,-0.5367],
[-0.5471,0.0062,-0.6338],
[-0.6437,0.1216,-0.5255],
[-0.4437,0.3216,-0.3255],
); # note: I changed from an array whose only element is an arrayref
+of arrayrefs to an array who has n arrayrefs, to be a simple 2D array
use Math::Spline;
my (@x,@y,@z,@t);
# generate x, y, and z arrays, and a t array
my $pt = 0;
for my $xyz (@accel) {
push @t, $pt++;
push @x, $xyz->[0];
push @y, $xyz->[1];
push @z, $xyz->[2];
}
# create spline calculators for x&y and x&z
my $spline_tx = eval { Math::Spline::->new(\@t, \@x) } or do { die "ty
+: $@" };
my $spline_ty = eval { Math::Spline::->new(\@t, \@y) } or do { die "ty
+: $@" };
my $spline_tz = eval { Math::Spline::->new(\@t, \@z) } or do { die "tz
+: $@" };
my @interp_accel = ();
my $NSTEPS = 200;
my $dt = $pt/$NSTEPS; # $NSTEPS+1 values from xmin to xmax, inclusive
for my $i (0..$NSTEPS) {
my $t = $i * $dt;
my $x = $spline_tx->evaluate($t);
my $y = $spline_ty->evaluate($t);
my $z = $spline_tz->evaluate($t);
push @interp_accel, [$x,$y,$z]; # store for later
printf "interpolate # %d => t=%.2f => [%s,%s,%s]\n", $i, map {$_//
+'<undef>'} $t, $x, $y, $z; # debug print
}
I then get the four fixed points at t=0, t=1, t=2, and t=3, with interpolated values everywhere else (I snipped intermediate values, except near the fixed points)
interpolate # 0 => t=0.00 => [-0.7437,0.1118,-0.5367]
interpolate # 1 => t=0.02 => [-0.73780958368,0.10862255968,-0.53961481
+072]
interpolate # 2 => t=0.04 => [-0.73192386944,0.10544767744,-0.54252728
+576]
...
interpolate # 48 => t=0.96 => [-0.54759113856,0.00641293056,-0.6335783
+4624]
interpolate # 49 => t=0.98 => [-0.54723036832,0.00624379232,-0.6337463
+9728]
interpolate # 50 => t=1.00 => [-0.5471,0.0062,-0.6338]
interpolate # 51 => t=1.02 => [-0.5472023792,0.0062833216,-0.633737511
+2]
interpolate # 52 => t=1.04 => [-0.5475304256,0.00649236480000001,-0.63
+35600576]
...
interpolate # 98 => t=1.96 => [-0.6433479104,0.1142666112,-0.532585126
+4]
interpolate # 99 => t=1.98 => [-0.6436376048,0.1179228224,-0.529056384
+8]
interpolate # 100 => t=2.00 => [-0.6437,0.1216,-0.5255]
interpolate # 101 => t=2.02 => [-0.64352802112,0.12529626272,-0.521917
+57408]
interpolate # 102 => t=2.04 => [-0.64312404096,0.12901093376,-0.518309
+84064]
...
interpolate # 148 => t=2.96 => [-0.45563928704,0.31328743424,-0.333929
+71136]
interpolate # 149 => t=2.98 => [-0.44967201088,0.31744352928,-0.329715
+11392]
interpolate # 150 => t=3.00 => [-0.4437,0.3216,-0.3255]
interpolate # 151 => t=3.02 => [-0.43772798912,0.32575647072,-0.321284
+88608]
interpolate # 152 => t=3.04 => [-0.43176071296,0.32991256576,-0.317070
+28864]
...
interpolate # 198 => t=3.96 => [-0.24427595904,0.51418906624,-0.132690
+15936]
interpolate # 199 => t=3.98 => [-0.24387197888,0.51790373728,-0.129082
+42592]
interpolate # 200 => t=4.00 => [-0.2437,0.5216,-0.1255]
|