 |
OpendTect
6.6
|
Go to the documentation of this file.
52 void setOutsideValue(T val);
70 void setOutput(
int,
int,
int,
bool addseed);
72 int getNextWorkCompartment();
73 void returnCompartment(
int);
75 int getWorkCompartment(
int,
int,
int)
const;
122 template <
class T>
inline
127 , threshold_(threshold)
128 , aboveisovalue_(max)
129 , insideval_(
mUdf(T))
130 , use6neighbors_(true)
132 , sz0_(input.info().getSize(0))
133 , sz1_(input.info().getSize(1))
134 , sz2_(input.info().getSize(2))
158 for (
int idx=0; idx<nrcompartments; idx++ )
164 std::random_shuffle(
mVarLenArr(arr), arr+nrcompartments );
165 for (
int idx=0; idx<nrcompartments; idx++ )
170 template <
class T>
inline
178 template <
class T>
inline
181 return (x0/compsz0_)*(x1/compsz1_)*(x2/compsz2_);
185 template <
class T>
inline
189 output_.setAll( outsideval_ );
193 template <
class T>
inline
196 setOutput( x0, x1, x2,
true );
200 template <
class T>
inline
203 if ( x0<0 || x0>=sz0_ || x1<0 || x1>=sz1_ || x2<0 || x2>=sz2_ )
208 const int cellidx = getWorkCompartment( x0, x1, x2 );
210 compartments_[cellidx]->lock_.readLock();
211 if ( isdefined_->get(x0,x1,x2) )
213 compartments_[cellidx]->lock_.readUnLock();
217 if ( !compartments_[cellidx]->lock_.convReadToWriteLock() )
219 if ( isdefined_->get(x0,x1,x2) )
221 compartments_[cellidx]->lock_.writeUnLock();
227 isdefined_->set( x0, x1, x2,
true );
229 const T inputval = input_.get( x0, x1, x2 );
232 if ( !useinputval_ && ((aboveisovalue_ && inputval<threshold_) ||
233 (!aboveisovalue_ && inputval>threshold_)) )
236 output_.set( x0, x1, x2, val );
238 if ( addseed && ((aboveisovalue_ && inputval>=threshold_) ||
239 (!aboveisovalue_ && inputval<=threshold_) ) )
242 int seed[] = { x0, x1, x2 };
243 compartments_[cellidx]->seeds_.add( &dummy, seed );
244 compartmentlock_.signal(
false );
247 compartments_[cellidx]->lock_.writeUnLock();
251 template <
class T>
inline
254 compartmentlock_.lock();
257 bool nothingleft =
true;
258 for (
int idx=permutation_.size()-1; idx>=0; idx-- )
260 const int compidx = permutation_[idx];
261 if ( compartments_[compidx]->isused_ )
265 compartments_[compidx]->lock_.readLock();
266 if ( !compartments_[compidx]->seeds_.isEmpty() )
268 compartments_[compidx]->lock_.readUnLock();
269 compartments_[compidx]->isused_ =
true;
270 compartmentlock_.unLock();
274 compartments_[compidx]->lock_.readUnLock();
281 compartmentlock_.wait();
284 compartmentlock_.unLock();
289 template <
class T>
inline
292 compartmentlock_.lock();
293 compartments_[comp]->isused_ =
false;
294 compartmentlock_.unLock();
295 compartmentlock_.signal(
true );
299 template <
class T>
inline
302 while ( shouldContinue() )
304 const int compidx = getNextWorkCompartment();
320 returnCompartment( compidx );
328 for (
int i=-1; i<=1; i++ )
330 for (
int j=-1; j<=1; j++ )
332 for (
int k=-1; k<=1; k++ )
334 const char nrzeros = !i + !j + !k;
338 const bool addseed = !use6neighbors_ || nrzeros==2;
339 setOutput( arrpos[0]+i, arrpos[1]+j, arrpos[2]+k,
349 returnCompartment( compidx );
bool useinputval_
Definition: array3dfloodfill.h:80
int nrcomp2_
Definition: array3dfloodfill.h:88
Array3DFloodfill(const Array3D< T > &input, T threshold, bool aboveisovalue, Array3D< T > &output)
Definition: array3dfloodfill.h:123
~Array3DFloodfill()
Definition: array3dfloodfill.h:171
int nrcomp1_
Definition: array3dfloodfill.h:86
T insideval_
Definition: array3dfloodfill.h:81
TypeSet< int > permutation_
Definition: array3dfloodfill.h:108
void addSeed(int, int, int)
Definition: array3dfloodfill.h:194
ObjectSet< Compartment > compartments_
Definition: array3dfloodfill.h:104
Set of pointers to objects.
Definition: commontypes.h:31
Array3DImpl< bool > * isdefined_
Definition: array3dfloodfill.h:115
T threshold_
Definition: array3dfloodfill.h:77
bool convReadToWriteLock()
#define mVarLenArr(varnm)
Definition: varlenarray.h:55
Lock that permits multiple readers to lock the object at the same time, but it will not allow any rea...
Definition: thread.h:143
#define od_int64
Definition: plftypes.h:35
void setInsideValue(T val)
Definition: array3dfloodfill.h:55
Compartment()
Definition: array3dfloodfill.h:97
bool isused_
Protected by compartmentlock_.
Definition: array3dfloodfill.h:99
void addSeed(EM::SectionID, EM::SubID)
T outsideval_
Definition: array3dfloodfill.h:82
Definition: array3dfloodfill.h:96
const Array3D< T > & input_
Not protected.
Definition: array3dfloodfill.h:110
void readLock()
No writers will be active.
int compsz2_
Definition: array3dfloodfill.h:89
Array3D ( Subclass of ArrayND ) is a three dimensional array.
Definition: arraynd.h:162
void returnCompartment(int)
Definition: array3dfloodfill.h:290
bool doWork(od_int64 start, od_int64 stop, int)
Definition: array3dfloodfill.h:300
Threads::ConditionVar compartmentlock_
Definition: array3dfloodfill.h:105
bool getIndex(int global_pos, IDX &) const
Definition: multidimstorage.h:535
#define mMaxNrComp
Definition: array3dfloodfill.h:23
#define mClass(module)
Definition: commondefs.h:181
int sz0_
Definition: array3dfloodfill.h:91
void setOutsideValue(T val)
Definition: array3dfloodfill.h:186
Is an object that faciliates many threads to wait for something to happen.
Definition: thread.h:110
int getPos(int idx) const
Definition: multidimstorage.h:309
Threads::ReadWriteLock lock_
Definition: array3dfloodfill.h:100
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:37
MultiDimStorage< int > seeds_
Protected by lock_.
Definition: array3dfloodfill.h:101
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:66
int compsz1_
Definition: array3dfloodfill.h:87
int maxNrThreads() const
Definition: array3dfloodfill.h:65
int use6neighbors_
Definition: array3dfloodfill.h:79
void deepErase(BufferStringSet &)
Array3D< T > & output_
Definition: array3dfloodfill.h:112
void remove(const IDX &index)
Definition: multidimstorage.h:483
int getNextWorkCompartment()
Definition: array3dfloodfill.h:252
bool aboveisovalue_
Definition: array3dfloodfill.h:78
int sz2_
Definition: array3dfloodfill.h:93
int getWorkCompartment(int, int, int) const
Definition: array3dfloodfill.h:179
#define mAllocVarLenArr(type, varnm, __size)
Definition: varlenarray.h:53
bool isEmpty() const
Definition: multidimstorage.h:253
Given an input array and a threshold, we use flood fill to find all the locations with values less (o...
Definition: array3dfloodfill.h:46
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:274
od_int64 nrIterations() const
Definition: array3dfloodfill.h:66
int compsz0_
Definition: array3dfloodfill.h:85
bool isAboveIsovalue() const
Definition: array3dfloodfill.h:62
void useInputValue(bool yn)
Definition: array3dfloodfill.h:57
int sz1_
Definition: array3dfloodfill.h:92
void use6Neighbors(bool yn)
Definition: array3dfloodfill.h:58
void setOutput(int, int, int, bool addseed)
Definition: array3dfloodfill.h:201
const T * getData() const
Definition: arraynd.h:54
int nrcomp0_
Definition: array3dfloodfill.h:84
Generated at
for the OpendTect
seismic interpretation project.
Copyright (C): dGB Beheer B.V. 1995-2021