OpendTect  6.3
interpol3d.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: Mar 2006
9 ________________________________________________________________________
10 
11 */
12 
13 #include "undefval.h"
14 
15 
16 namespace Interpolate
17 {
18 
23 template <class T>
25 {
26 public:
27 
29 
30 LinearReg3D( const T* const* const* v )
31 {
32  set( v[0][0][0], v[1][0][0], v[0][1][0], v[1][1][0],
33  v[0][0][1], v[1][0][1], v[0][1][1], v[1][1][1] );
34 }
35 
36 LinearReg3D( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111 )
37 {
38  set( v000, v100, v010, v110, v001, v101, v011, v111 );
39 }
40 
41 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
42 {
43  a_[0] = v000;
44  a_[1] = v100 - v000;
45  a_[2] = v010 - v000;
46  a_[3] = v001 - v000;
47  a_[4] = v110 + v000 - v100 - v010;
48  a_[5] = v101 + v000 - v100 - v001;
49  a_[6] = v011 + v000 - v010 - v001;
50  a_[7] = v111 + v100 + v010 + v001 - (v000 + v110 + v101 + v011);
51 }
52 
53 inline T apply( float x, float y, float z ) const
54 {
55  return a_[0] + a_[1] * x + a_[2] * y + a_[3] * z
56  + a_[4] * x * y + a_[5] * x * z + a_[6] * y * z
57  + a_[7] * x * y * z;
58 }
59 
60  T a_[8];
61 
62 };
63 
64 
65 template <class T>
66 inline T linearReg3D( T v000, T v100, T v010, T v110,
67  T v001, T v101, T v011, T v111,
68  float x, float y, float z )
69 {
70  return LinearReg3D<T>( v000, v100, v010, v110, v001, v101, v011, v111 )
71  .apply( x, y, z );
72 }
73 
74 
79 template <class T>
81 {
82 public:
83 
85 
86 LinearReg3DWithUdf( const T* const* const* v )
87 {
88  set( v[0][0][0], v[1][0][0], v[0][1][0], v[1][1][0],
89  v[0][0][1], v[1][0][1], v[0][1][1], v[1][1][1] );
90 }
91 
92 LinearReg3DWithUdf( T v000, T v100, T v010, T v110,
93  T v001, T v101, T v011, T v111 )
94 {
95  set( v000, v100, v010, v110, v001, v101, v011, v111 );
96 }
97 
98 inline static T getReplVal( T v1, T v2, T v3, bool u1, bool u2, bool u3 )
99 {
100 
101  if ( u1 )
102  return u2 ? v3 : (u3 ? v2 : (v2 + v3) / 2);
103  else if ( u2 )
104  return u3 ? v1 : (v1 + v3) / 2;
105  else if ( u3 )
106  return (v1 + v2) / 2;
107 
108  return (v1 + v2 + v3) / 3;
109 }
110 
111 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
112 {
113  u000_ = mIsUdf(v000);
114  u100_ = mIsUdf(v100);
115  u010_ = mIsUdf(v010);
116  u110_ = mIsUdf(v110);
117  u001_ = mIsUdf(v001);
118  u101_ = mIsUdf(v101);
119  u011_ = mIsUdf(v011);
120  u111_ = mIsUdf(v111);
121  haveudf_ = u000_ || u100_ || u010_ || u110_
122  || u001_ || u101_ || u011_ || u111_;
123 
124  if ( haveudf_ )
125  {
126 # define mFillIfUdf(nd,nearx,neary,nearz,diagxy,diagxz,diagyz,opp) \
127  if ( u##nd##_ ) \
128  { \
129  if ( !u##nearx##_ || !u##neary##_ || !u##nearz##_ ) \
130  v##nd = getReplVal( v##nearx, v##neary, v##nearz, \
131  u##nearx##_, u##neary##_, u##nearz##_ ); \
132  else \
133  { \
134  if ( u##diagxy##_ && u##diagxz##_ && u##diagyz##_ ) \
135  v##nd = v##opp; \
136  else \
137  v##nd = getReplVal( v##diagxy, v##diagxz, v##diagyz, \
138  u##diagxy##_, u##diagxz##_, u##diagyz##_ ); \
139  } \
140  }
141 
142  mFillIfUdf(000,100,010,001,110,101,011,111)
143  mFillIfUdf(100,000,110,101,010,001,111,011)
144  mFillIfUdf(010,110,000,011,100,111,001,101)
145  mFillIfUdf(110,010,100,111,000,011,101,001)
146  mFillIfUdf(001,101,011,000,111,100,010,110)
147  mFillIfUdf(101,001,111,100,011,000,110,010)
148  mFillIfUdf(011,111,001,010,101,110,000,100)
149  mFillIfUdf(111,011,101,110,001,010,100,000)
150 
151 # undef mFillIfUdf
152  }
153 
154  intp_.set( v000, v100, v010, v110, v001, v101, v011, v111 );
155 }
156 
157 inline T apply( float x, float y, float z ) const
158 {
159  // return undef if the nearest node is undef
160  if ( haveudf_ && (
161  ( u000_ && x < 0.5 && y < 0.5 && z < 0.5 )
162  || ( u100_ && x >= 0.5 && y < 0.5 && z < 0.5 )
163  || ( u010_ && x < 0.5 && y >= 0.5 && z < 0.5 )
164  || ( u110_ && x >= 0.5 && y >= 0.5 && z < 0.5 )
165  || ( u001_ && x < 0.5 && y < 0.5 && z >= 0.5 )
166  || ( u101_ && x >= 0.5 && y < 0.5 && z >= 0.5 )
167  || ( u011_ && x < 0.5 && y >= 0.5 && z >= 0.5 )
168  || ( u111_ && x >= 0.5 && y >= 0.5 && z >= 0.5 ) ) )
169  return mUdf(T);
170 
171  return intp_.apply( x, y, z );
172 }
173 
175  bool haveudf_;
176  bool u000_;
177  bool u100_;
178  bool u010_;
179  bool u110_;
180  bool u001_;
181  bool u101_;
182  bool u011_;
183  bool u111_;
184 
185 };
186 
187 template <class T>
188 inline T linearReg3DWithUdf( T v000, T v100, T v010, T v110,
189  T v001, T v101, T v011, T v111,
190  float x, float y, float z )
191 {
192  return LinearReg3DWithUdf<T>(v000,v100,v010,v110,v001,v101,v011,v111)
193  .apply( x, y, z );
194 }
195 
196 
197 
216 template <class T>
218 {
219 public:
220 
222 
223 PolyReg3D( const T* const* const * v )
224 {
225  set( v[0][1][1], v[0][1][2], v[0][2][1], v[0][2][2],
226  v[1][0][1], v[1][0][2], v[1][1][0], v[1][1][1],
227  v[1][1][2], v[1][1][3], v[1][2][0], v[1][2][1],
228  v[1][2][2], v[1][2][3], v[1][3][1], v[1][3][2],
229  v[2][0][1], v[2][0][2], v[2][1][0], v[2][1][1],
230  v[2][1][2], v[2][1][3], v[2][2][0], v[2][2][1],
231  v[2][2][2], v[2][2][3], v[2][3][1], v[2][3][2],
232  v[3][1][1], v[3][1][2], v[3][2][1], v[3][2][2] );
233 }
234 
236  T vm100, T vm101, T vm110, T vm111,
237  T v0m10, T v0m11, T v00m1, T v000,
238  T v001, T v002, T v01m1, T v010,
239  T v011, T v012, T v020, T v021,
240  T v1m10, T v1m11, T v10m1, T v100,
241  T v101, T v102, T v11m1, T v110,
242  T v111, T v112, T v120, T v121,
243  T v200, T v201, T v210, T v211 )
244 {
245  set( vm100, vm101, vm110, vm111,
246  v0m10, v0m11, v00m1, v000,
247  v001, v002, v01m1, v010,
248  v011, v012, v020, v021,
249  v1m10, v1m11, v10m1, v100,
250  v101, v102, v11m1, v110,
251  v111, v112, v120, v121,
252  v200, v201, v210, v211 );
253 }
254 
255 inline void set(
256  T vm100, T vm101, T vm110, T vm111,
257  T v0m10, T v0m11, T v00m1, T v000,
258  T v001, T v002, T v01m1, T v010,
259  T v011, T v012, T v020, T v021,
260  T v1m10, T v1m11, T v10m1, T v100,
261  T v101, T v102, T v11m1, T v110,
262  T v111, T v112, T v120, T v121,
263  T v200, T v201, T v210, T v211 )
264 {
265  set( v000, v100, v010, v110, v001, v101, v011, v111,
266  (v00m1 + v01m1 + v10m1 + v11m1) / 4,
267  (v0m10 + v0m11 + v1m10 + v1m11) / 4,
268  (vm100 + vm101 + vm110 + vm111) / 4,
269  (v002 + v012 + v102 + v112) / 4,
270  (v020 + v021 + v120 + v121) / 4,
271  (v200 + v201 + v210 + v211) / 4 );
272 }
273 
274 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111,
275  T vxym1, T vxzm1, T vyzm1, T vxy1, T vxz1, T vyz1 )
276 {
277  // TODO
278 }
279 
280 inline T apply( float x, float y, float z ) const
281 {
282  return a_[0] + a_[1] * x + a_[2] * y + a_[3] * z
283  + a_[4] * x * y + a_[5] * x * z + a_[6] * y * z
284  + a_[7] * x * y * z
285  + a_[8] * x * x * y + a_[9] * x * x * z
286  + a_[10] * y * y * x + a_[11] * y * y * z
287  + a_[12] * z * z * x + a_[13] * z * z * y;
288 }
289 
290  T a_[14];
291 
292 };
293 
294 
295 template <class T>
296 inline T polyReg3D( const T* const* const * v, float x, float y, float z )
297 {
298  return PolyReg3D<T>( v ).apply( x, y, z );
299 }
300 
301 
311 } // namespace Interpolate
Definition: interpol1d.h:36
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
bool u110_
Definition: interpol3d.h:179
T apply(float x, float y, float z) const
Definition: interpol3d.h:157
LinearReg3D()
Definition: interpol3d.h:28
LinearReg3DWithUdf(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
Definition: interpol3d.h:92
bool u101_
Definition: interpol3d.h:181
bool u000_
Definition: interpol3d.h:176
Interpolate 3D regularly sampled, using a 3rd order surface.
Definition: interpol3d.h:217
static T getReplVal(T v1, T v2, T v3, bool u1, bool u2, bool u3)
Definition: interpol3d.h:98
PolyReg3D(T vm100, T vm101, T vm110, T vm111, T v0m10, T v0m11, T v00m1, T v000, T v001, T v002, T v01m1, T v010, T v011, T v012, T v020, T v021, T v1m10, T v1m11, T v10m1, T v100, T v101, T v102, T v11m1, T v110, T v111, T v112, T v120, T v121, T v200, T v201, T v210, T v211)
Definition: interpol3d.h:235
LinearReg3DWithUdf()
Definition: interpol3d.h:84
bool u010_
Definition: interpol3d.h:178
LinearReg3D< T > intp_
Definition: interpol3d.h:174
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
T linearReg3DWithUdf(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111, float x, float y, float z)
Definition: interpol3d.h:188
PolyReg3D(const T *const *const *v)
Definition: interpol3d.h:223
T apply(float x, float y, float z) const
Definition: interpol3d.h:53
bool haveudf_
Definition: interpol3d.h:175
#define mFillIfUdf(nd, nearx, neary, nearz, diagxy, diagxz, diagyz, opp)
LinearReg3DWithUdf(const T *const *const *v)
Definition: interpol3d.h:86
bool u111_
Definition: interpol3d.h:183
LinearReg3D(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
Definition: interpol3d.h:36
Linear 3D interpolation.
Definition: interpol3d.h:24
Linear 3D interpolation with standard undef handling.
Definition: interpol3d.h:80
bool u100_
Definition: interpol3d.h:177
PolyReg3D()
Definition: interpol3d.h:221
T polyReg3D(const T *const *const *v, float x, float y, float z)
PolyReg3D which smoothly handles undefined values.
Definition: interpol3d.h:296
bool u011_
Definition: interpol3d.h:182
T apply(float x, float y, float z) const
Definition: interpol3d.h:280
T linearReg3D(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111, float x, float y, float z)
Definition: interpol3d.h:66
#define mClass(module)
Definition: commondefs.h:161
bool u001_
Definition: interpol3d.h:180
LinearReg3D(const T *const *const *v)
Definition: interpol3d.h:30

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