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

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