.interp.linear.orig
changeset 39 56bdfe65a697
equal deleted inserted replaced
38:15c603bc4f70 39:56bdfe65a697
       
     1 #======================================================================
       
     2 #                    . I N T E R P . L I N E A R 
       
     3 #                    doc: Wed Nov 22 21:01:09 2000
       
     4 #                    dlm: Fri Sep 23 16:32:20 2011
       
     5 #                    (c) 2000 A.M. Thurnherr
       
     6 #                    uE-Info: 62 0 NIL 0 0 72 2 2 4 NIL ofnI
       
     7 #======================================================================
       
     8 
       
     9 # linear interpolation
       
    10 
       
    11 # HISTORY:
       
    12 # 	Nov 22, 2000: - created
       
    13 #	Jul 28, 2006: - Version 3.3 [HISTORY]
       
    14 #				  - added xf to ISInit() args
       
    15 #	Aug 22, 2006: - modified to allow use with [match]
       
    16 #	Aug  5, 2008: - added idr param to IS_init()
       
    17 #	Sep 23, 2011: - added support for xfnr==-1 (%RECNO)
       
    18 
       
    19 # NOTES:
       
    20 #	- the [.interp.*] routines assume that x increases strictly monotonically;
       
    21 #	  for utilities dealing with non-monotonic data, use [.nminterp.*] instead
       
    22 #	- the [.interp.*] routines are written to work on multiple buffers,
       
    23 #	  rather than just @ants_; this implies that data created by IS_init()
       
    24 #	  must be stored separately for each buffer
       
    25 
       
    26 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    27 #
       
    28 # THE FOLLOWING VARIABLES MUST BE SET GLOBALLY (i.e. during loading)
       
    29 #
       
    30 #	$IS_opts			string of allowed options
       
    31 #	$IS_optsUsage		usage information string for options
       
    32 #
       
    33 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    34 
       
    35 $IS_opts = "";
       
    36 $IS_optsUsage = "";
       
    37 
       
    38 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    39 #
       
    40 # &IS_usage() 	mangle parameters (options, really)
       
    41 #
       
    42 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    43 
       
    44 sub IS_usage() {}
       
    45 
       
    46 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    47 #
       
    48 # &IS_init(br,f,xf)			init interpolation of field f
       
    49 #		br					data buffer reference
       
    50 #		idr					init-data reference
       
    51 #       f					field number
       
    52 #		xf					x field number or -1 for %RECNO
       
    53 #       <ret val>           none
       
    54 #
       
    55 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    56 
       
    57 sub IS_init($$$$) {}
       
    58 
       
    59 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    60 #
       
    61 # &IS_interpolate(bR,idR,xf,xv,xi,f)	interpolate field f
       
    62 #		bR							data buffer reference
       
    63 #		idR							init-data reference
       
    64 #		xf							x field or -1 for %RECNO
       
    65 #		xv							x value
       
    66 #		xi							index of last record with x-value <= x
       
    67 #		f							field number to interpolate
       
    68 #		<ret val>					interpolated value
       
    69 #
       
    70 # NB:
       
    71 #	- handle f == xf
       
    72 #	- return NaN if any of the y values required is NaN
       
    73 #
       
    74 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
    75 
       
    76 sub IS_interpolate($$$$$$)
       
    77 {
       
    78 	my($bR,$idR,$xf,$xv,$xi,$f) = @_;
       
    79 	return $xv if ($xf == $f);
       
    80 	return nan unless (numberp($bR->[$xi][$f]) && numberp($bR->[$xi+1][$f]));
       
    81 
       
    82 	my($sc) = ($xf < 0)
       
    83 			? ($xv - $bR->[$xi][$xf]) / ($bR->[$xi+1][$xf] - $bR->[$xi][$xf]);
       
    84 			: ($xv - $bR->[$xi][$xf]) / ($bR->[$xi+1][$xf] - $bR->[$xi][$xf]);
       
    85 	return $bR->[$xi][$f] + $sc * ($bR->[$xi+1][$f] - $bR->[$xi][$f]);
       
    86 }
       
    87 
       
    88 #----------------------------------------------------------------------
       
    89 
       
    90 1;