OpendTect  6.6
valseriesinterpol.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Bert Bril & Kris Tingdahl
8  Date: Mar 2005
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "valseries.h"
15 #include "periodicvalue.h"
16 
17 /*\brief interpolates between values of a ValueSeries object
18 
19  Note that we assume that the values are equidistant in 'X'.
20 
21  */
22 
23 template <class T>
25 {
26 public:
27  ValueSeriesInterpolator( int mxidx=mUdf(int) )
28  : maxidx_(mxidx)
29  , snapdist_(0)
30  , smooth_(true)
31  , extrapol_(false)
32  , udfval_(mUdf(T))
33  , isperiodic_(false)
34  , period_(1)
35  , linear_(false)
36  , hasudfs_(true) {}
37 
38  inline T value(const ValueSeries<T>&,T pos) const;
39 
40  int maxidx_;
43  bool smooth_;
44  bool extrapol_;
46  bool hasudfs_;
48  bool linear_;
49 
50 };
51 
52 
53 #define mChkVSIRg \
54  { if ( curidx < 0 ) curidx = 0; \
55  else if ( curidx > maxidx_ ) curidx = maxidx_; }
56 
57 
58 template <class T>
60  T pos ) const
61 {
62  if ( !extrapol_ && (pos < -snapdist_ || pos > maxidx_ + snapdist_) )
63  return udfval_;
64  else if ( maxidx_ < 1 )
65  return vda.value( 0 );
66 
67  int curidx = mNINT32(pos); mChkVSIRg
68  if ( !smooth_ || mIsEqual(pos,curidx,snapdist_) )
69  return vda.value( curidx );
70 
71  T v[4]; const int lopos = (int)pos;
72  curidx = lopos - 1; mChkVSIRg; v[0] = vda.value( curidx );
73  curidx = lopos; mChkVSIRg; v[1] = vda.value( curidx );
74  curidx = lopos + 1; mChkVSIRg; v[2] = vda.value( curidx );
75  curidx = lopos + 2; mChkVSIRg; v[3] = vda.value( curidx );
76 
77  pos -= lopos; // now 0 < pos < 1
78  T rv;
79  if ( !isperiodic_ )
80  {
81  if ( linear_ )
82  {
83  if ( hasudfs_ && (mIsUdf(v[1]) || mIsUdf(v[2])) )
84  rv = pos < 0.5 ? v[1] : v[2];
85  else
86  rv = pos*v[2] + (1-pos)*v[1];
87  }
88  else
89  rv = hasudfs_
90  ? Interpolate::polyReg1DWithUdf( v[0], v[1], v[2], v[3], pos )
91  : Interpolate::polyReg1D( v[0], v[1], v[2], v[3], pos );
92  }
93  else
94  {
95  if ( hasudfs_ )
96  {
97  if ( mIsUdf(v[0]) ) v[0] = v[1];
98  if ( mIsUdf(v[3]) ) v[3] = v[2];
99  if ( mIsUdf(v[1]) || mIsUdf(v[2]) )
100  return udfval_;
101  }
102  pos += 1; // now 1 < pos < 2
103  rv = IdxAble::interpolateYPeriodicReg( v, 4, pos, period_, false );
104  }
105  if ( mIsUdf(rv) )
106  rv = udfval_;
107 
108  return rv;
109 }
110 
111 #undef mChkVSIRg
112 
113 
ValueSeries
Interface to a series of values.
Definition: odmemory.h:16
ValueSeriesInterpolator::udfval_
T udfval_
Definition: valseriesinterpol.h:42
mChkVSIRg
#define mChkVSIRg
Definition: valseriesinterpol.h:53
mIsEqual
#define mIsEqual(x, y, eps)
Definition: commondefs.h:67
ValueSeries::value
virtual T value(int64_t) const =0
valseries.h
ValueSeriesInterpolator::linear_
bool linear_
Definition: valseriesinterpol.h:48
mIsUdf
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:289
ValueSeriesInterpolator::period_
T period_
Definition: valseriesinterpol.h:47
ValueSeriesInterpolator::isperiodic_
bool isperiodic_
Definition: valseriesinterpol.h:45
periodicvalue.h
ValueSeriesInterpolator::maxidx_
int maxidx_
Definition: valseriesinterpol.h:40
IdxAble::interpolateYPeriodicReg
void interpolateYPeriodicReg(const T &idxabl, int sz, float pos, RT &ret, RT period, bool extrapolate=false)
Definition: periodicvalue.h:126
mClass
#define mClass(module)
Definition: commondefs.h:181
ValueSeriesInterpolator::snapdist_
T snapdist_
Definition: valseriesinterpol.h:41
ValueSeriesInterpolator
Definition: valseriesinterpol.h:25
ValueSeriesInterpolator::extrapol_
bool extrapol_
Definition: valseriesinterpol.h:44
ValueSeriesInterpolator::smooth_
bool smooth_
Definition: valseriesinterpol.h:43
Interpolate::polyReg1DWithUdf
T polyReg1DWithUdf(T vm1, T v0, T v1, T v2, float x)
Definition: interpol1d.h:188
mUdf
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:274
ValueSeriesInterpolator::value
T value(const ValueSeries< T > &, T pos) const
Definition: valseriesinterpol.h:59
Interpolate::polyReg1D
T polyReg1D(T vm1, T v0, T v1, T v2, float x)
Definition: interpol1d.h:129
ValueSeriesInterpolator::hasudfs_
bool hasudfs_
Definition: valseriesinterpol.h:46
ValueSeriesInterpolator::ValueSeriesInterpolator
ValueSeriesInterpolator(int mxidx=mUdf(int))
Definition: valseriesinterpol.h:27
mNINT32
#define mNINT32(x)
Definition: commondefs.h:58

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021