OpendTect  6.3
squeezing.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
8  Date: Aug 2010
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "algomod.h"
14 #include "ranges.h"
15 
40 template <class T>
42 {
43 public:
44 
45  inline DataSqueezer( const Interval<T>& l )
46  : urg_(mUdf(T),mUdf(T)) { setRange(l,true); }
47  void setUntouchedRange( const Interval<T>& r ) { setRange(r,false); }
48 
49  inline DataSqueezer( T l0, T l1 ) : urg_(mUdf(T),mUdf(T))
50  { setRange(Interval<T>(l0,l1),true); }
51  void setUntouchedRange( T u0, T u1 )
52  { setRange(Interval<T>(u0,u1),false); }
53 
54  T value(T) const;
55 
56  const Interval<T>& range( bool lim ) const { return lim?rg_:urg_; }
57  void setRange(const Interval<T>&,bool lim);
58 
59 protected:
60 
63  bool udfstart_, udfstop_;
64  bool udfustart_, udfustop_;
65 
66 };
67 
68 
69 template <class T>
70 inline void DataSqueezer<T>::setRange( const Interval<T>& inprg, bool lim )
71 {
72  Interval<T>& rg = lim ? rg_ : urg_;
73  rg = inprg;
74  if ( !mIsUdf(rg.start) && !mIsUdf(rg.stop) )
75  rg.sort(true);
76 
77  udfstart_ = mIsUdf(rg_.start); udfstop_ = mIsUdf(rg_.stop);
78  udfustart_ = mIsUdf(urg_.start); udfustop_ = mIsUdf(urg_.stop);
79  if ( !udfstart_ && !udfustart_ && urg_.start <= rg_.start )
80  { urg_.start = mUdf(T); udfustart_ = true; }
81  if ( !udfstop_ && !udfustop_ && urg_.stop >= rg_.stop )
82  { urg_.stop = mUdf(T); udfustop_ = true; }
83 }
84 
85 
86 template <class T>
87 inline T DataSqueezer<T>::value( T v ) const
88 {
89  if ( mIsUdf(v) ) return v;
90 
91  if ( !udfstart_ )
92  {
93  if ( udfustart_ )
94  {
95  if ( v < rg_.start )
96  v = rg_.start;
97  }
98  else if ( v < urg_.start )
99  {
100  const T w = rg_.start - urg_.start;
101  v = rg_.start - ((w*w) / (v + w - urg_.start));
102  }
103  }
104  if ( !udfstop_ )
105  {
106  if ( udfustop_ )
107  {
108  if ( v > rg_.stop )
109  v = rg_.stop;
110  }
111  else if ( v > urg_.stop )
112  {
113  const T w = rg_.stop - urg_.stop;
114  v = rg_.stop - ((w*w) / (v + w - urg_.stop));
115  }
116  }
117 
118  return v;
119 }
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
bool udfustop_
Definition: squeezing.h:64
void setUntouchedRange(T u0, T u1)
Definition: squeezing.h:51
Interval of values.
Definition: commontypes.h:27
void setRange(const Interval< T > &, bool lim)
Definition: squeezing.h:70
bool udfstop_
Definition: squeezing.h:63
void setUntouchedRange(const Interval< T > &r)
Definition: squeezing.h:47
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
Interval< T > rg_
Definition: squeezing.h:61
Fits values into a pre-defined range.
Definition: squeezing.h:41
T stop
Definition: ranges.h:91
const Interval< T > & range(bool lim) const
Definition: squeezing.h:56
DataSqueezer(const Interval< T > &l)
Definition: squeezing.h:45
DataSqueezer(T l0, T l1)
Definition: squeezing.h:49
T start
Definition: ranges.h:90
T value(T) const
Definition: squeezing.h:87
virtual void sort(bool asc=true)
Definition: ranges.h:584
#define mClass(module)
Definition: commondefs.h:161
Interval< T > urg_
Definition: squeezing.h:62

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