OpendTect  6.6
delaunay.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: Y.C. Liu
8  Date: January 2008
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "algomod.h"
15 #include "coord.h"
16 #include "odmemory.h"
17 #include "typeset.h"
18 #include "thread.h"
19 #include "trigonometry.h"
20 class od_ostream;
21 
22 
23 #define mDAGTriangleForceSingleThread
24 
36 {
37 public:
40  virtual ~DAGTriangleTree();
42 
43  static bool computeCoordRanges(const TypeSet<Coord>&,
45 
48  const TypeSet<Coord>& coordList() const { return *coordlist_; }
49 
50  bool setBBox(const Interval<double>& xrg,
51  const Interval<double>& yrg);
52 
53  bool isOK() const { return triangles_.size(); }
54 
55  bool init();
56 
57  bool insertPoint(int pointidx, int& dupid);
58  int insertPoint(const Coord&, int& dupid);
59 
60  const Coord getInitCoord(int vetexidx) const;
61  bool getTriangle(const Coord&,int& dupid,
62  TypeSet<int>& vertexindices) const;
71  bool getConnections(int pointidx,TypeSet<int>&) const;
72  bool getWeights(int pointidx,const TypeSet<int>& conns,
73  TypeSet<double>& weights,
74  bool normalize=true) const;
76  bool getConnectionAndWeights(int ptidx,TypeSet<int>& conns,
77  TypeSet<double>& weights,
78  bool normailze=true) const;
79  void setEpsilon(double err) { epsilon_ = err; }
80 
81  void dumpTo(od_ostream&) const;
84 
85 
86  static int cNoVertex() { return -1; }
87 
88 protected:
89 
90  static char cIsOutside() { return 0; }
91  static char cIsInside() { return 1; }
92  static char cIsDuplicate() { return 2; }
93  static char cError() { return -1; }
94 
95  static int cNoTriangle() { return -1; }
96  static int cInitVertex0() { return -2; }
97  static int cInitVertex1() { return -3; }
98  static int cInitVertex2() { return -4; }
99 
100  char searchTriangle(const Coord& pt,int start,int& t0,
101  int& dupid) const;
102  char searchFurther(const Coord& pt,int& nti0,int& dupid) const;
103 
104  void splitTriangleInside(int ci,int ti);
107  TypeSet<int>& tis);
111  int getNeighbor(int v0,int v1,int ti) const;
112  int searchChild(int v0,int v1,int ti) const;
113  char isInside(const Coord& pt,int ti,int& dupid) const;
114 
115  struct DAGTriangle
116  {
118  bool operator==(const DAGTriangle&) const;
120 
121  int coordindices_[3];
122  int childindices_[3];
123  int neighbors_[3];
124 
125  bool hasChildren() const;
126  };
127 
129 
131 
132  double epsilon_;
134 
137 
139 
140  Coord initialcoords_[3];
142 };
143 
144 
151 public:
154 
155  bool isDataRandom() { return israndom_; }
156  void dataIsRandom(bool yn) { israndom_ = yn; }
157  void setCalcScope(const Interval<int>& rg);
158 
159 protected:
160 
161 #ifdef mDAGTriangleForceSingleThread
162  int maxNrThreads() const { return 1; }
163 #endif
165  bool doWork(od_int64,od_int64, int );
166  bool doPrepare(int);
167 
169  { return tr("Points triangulated"); }
170  uiString uiMessage() const { return tr("Triangulating"); }
171 
173  bool israndom_;
176 };
177 
178 
187 {
188 public:
190 
191  /*The vertices are indices from the DAGTriangleTree
192  coordlist, corresponding to the weights.*/
193  bool computeWeights(const Coord&,TypeSet<int>& vertices,
194  TypeSet<double>& weights,
195  double maxdist=mUdf(double),
196  bool dointerpolate=true);
197  /*If don't do interpolate, nearest node will be taken.*/
198 
199 protected:
200 
201  bool setFromAzimuth(const TypeSet<int>& tmpvertices,
202  const Coord&,
203  TypeSet<int>& vertices,
204  TypeSet<double>& weights);
213 
216 };
217 
218 
219 /*Simple polyon triangulation, does not work if you have holes inside it.
220  return each triangle with three indicies in order. */
221 inline bool PolygonTriangulate( const TypeSet<Coord>& knots,TypeSet<int>& res )
222 {
223  const int nrknots = knots.size();
224  if ( nrknots < 3 )
225  return false;
226 
227  /* Make sure it is a counter-clockwise polygon in ci */
228  double area=0;
229  for( int idx=nrknots-1, idy=0; idy<nrknots; idx=idy++ )
230  area += (knots[idx].x*knots[idy].y - knots[idy].x*knots[idx].y);
231  area *= 0.5;
232 
233  TypeSet<int> ci;
234  if ( 0<area )
235  {
236  for ( int idx=0; idx<nrknots; idx++ )
237  ci += idx;
238  }
239  else
240  {
241  for( int idx=0; idx<nrknots; idx++ )
242  ci += (nrknots-1-idx);
243  }
244 
245  /*Triangulate: three consecutive vertices (idx0,idx,idx1) in polygon,
246  remove cursize-2 Vertices, creating 1 triangle every time */
247  int cursize = nrknots;
248  int errcheck = 2*cursize;
249 
250  for( int idx=cursize-1; cursize>2; )
251  {
252  if ( 0 >= (errcheck--) )
253  return false;
254 
255  const int idx0 = cursize<=idx ? 0 : idx;
256  idx = cursize<=idx0+1 ? 0 : idx0+1;
257  const int idx1 = cursize<=idx+1 ? 0 : idx+1;
258 
259  const Coord& pos0 = knots[ci[idx0]];
260  const Coord& pos = knots[ci[idx]];
261  const Coord& pos1 = knots[ci[idx1]];
262  if ( (((pos.x-pos0.x)*(pos1.y-pos0.y)) -
263  ((pos.y-pos0.y)*(pos1.x-pos0.x)))<0 )
264  continue;
265 
266  bool isvalid = true;
267  for ( int idy=0; idy<cursize; idy++ )
268  {
269  if( (idy==idx0) || (idy==idx) || (idy==idx1) )
270  continue;
271 
272  if ( pointInTriangle2D(knots[ci[idy]],pos0,pos,pos1,0.0) )
273  {
274  isvalid = false;
275  break;
276  }
277  }
278 
279  if ( isvalid )
280  {
281  res += ci[idx0];
282  res += ci[idx];
283  res += ci[idx1];
284 
285  /* remove idx from remaining polygon */
286  for( int i=idx, j=idx+1; j<cursize; i++, j++ )
287  ci[i] = ci[j];
288 
289  cursize--;
290  errcheck = 2*cursize;
291  }
292  }
293 
294  return true;
295 }
296 
DAGTriangleTree::coordlock_
Threads::ReadWriteLock coordlock_
Definition: delaunay.h:138
DAGTriangleTree::~DAGTriangleTree
virtual ~DAGTriangleTree()
DAGTriangleTree::dumpTriangulationToIV
void dumpTriangulationToIV(od_ostream &) const
DAGTriangleTree::getNeighbor
int getNeighbor(int v0, int v1, int ti) const
DAGTriangleTree::legalizeTriangles
void legalizeTriangles(TypeSet< char > &v0s, TypeSet< char > &v1s, TypeSet< int > &tis)
DelaunayTriangulator::doWork
bool doWork(od_int64, od_int64, int)
DAGTriangleTree::cInitVertex1
static int cInitVertex1()
Definition: delaunay.h:97
DAGTriangleTree::DAGTriangleTree
DAGTriangleTree()
DAGTriangleTree::DAGTriangle::operator=
DAGTriangle & operator=(const DAGTriangle &)
PolygonTriangulate
bool PolygonTriangulate(const TypeSet< Coord > &knots, TypeSet< int > &res)
Definition: delaunay.h:221
odmemory.h
Triangle2DInterpolator
For a given triangulated geometry(set of points), interpolating any point located in or nearby the go...
Definition: delaunay.h:187
DelaunayTriangulator::calcscope_
Interval< od_int64 > calcscope_
Definition: delaunay.h:175
DAGTriangleTree::getWeights
bool getWeights(int pointidx, const TypeSet< int > &conns, TypeSet< double > &weights, bool normalize=true) const
Threads::ReadWriteLock
Lock that permits multiple readers to lock the object at the same time, but it will not allow any rea...
Definition: thread.h:143
od_int64
#define od_int64
Definition: plftypes.h:35
Triangle2DInterpolator::corner0_
TypeSet< int > corner0_
Definition: delaunay.h:206
Triangle2DInterpolator::perimeter_
TypeSet< int > perimeter_
Definition: delaunay.h:214
DelaunayTriangulator::tree_
DAGTriangleTree & tree_
Definition: delaunay.h:174
OD
OpendTect.
Definition: commontypes.h:28
DAGTriangleTree::getInitCoord
const Coord getInitCoord(int vetexidx) const
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
DelaunayTriangulator
The parallel triangulation works for only one processor now.
Definition: delaunay.h:150
DAGTriangleTree::DAGTriangle::operator==
bool operator==(const DAGTriangle &) const
DelaunayTriangulator::uiNrDoneText
uiString uiNrDoneText() const
will be nrDoneText() in 7.x
Definition: delaunay.h:168
DAGTriangleTree
Reference: "Parallel Incremental Delaunay Triangulation", by Kohout J.2005.
Definition: delaunay.h:36
Triangle2DInterpolator::cornerweights1_
TypeSet< double > cornerweights1_
Definition: delaunay.h:209
DAGTriangleTree::DAGTriangleTree
DAGTriangleTree(const DAGTriangleTree &)
DAGTriangleTree::multithreadsupport_
bool multithreadsupport_
Definition: delaunay.h:128
DelaunayTriangulator::isDataRandom
bool isDataRandom()
Definition: delaunay.h:155
DAGTriangleTree::setCoordList
bool setCoordList(const TypeSet< Coord > *OD)
typeset.h
DAGTriangleTree::operator=
DAGTriangleTree & operator=(const DAGTriangleTree &)
DAGTriangleTree::searchTriangle
char searchTriangle(const Coord &pt, int start, int &t0, int &dupid) const
DAGTriangleTree::setCoordList
bool setCoordList(TypeSet< Coord > *, OD::PtrPolicy)
DelaunayTriangulator::nrIterations
od_int64 nrIterations() const
DAGTriangleTree::computeCoordRanges
static bool computeCoordRanges(const TypeSet< Coord > &, Interval< double > &, Interval< double > &)
DAGTriangleTree::cError
static char cError()
Definition: delaunay.h:93
DAGTriangleTree::cInitVertex2
static int cInitVertex2()
Definition: delaunay.h:98
DAGTriangleTree::isOK
bool isOK() const
Definition: delaunay.h:53
DAGTriangleTree::trianglelock_
Threads::ReadWriteLock trianglelock_
Definition: delaunay.h:130
DAGTriangleTree::getConnectionAndWeights
bool getConnectionAndWeights(int ptidx, TypeSet< int > &conns, TypeSet< double > &weights, bool normailze=true) const
Triangle2DInterpolator::cornerweights0_
TypeSet< double > cornerweights0_
Definition: delaunay.h:207
DAGTriangleTree::ownscoordlist_
bool ownscoordlist_
Definition: delaunay.h:136
DAGTriangleTree::DAGTriangle::hasChildren
bool hasChildren() const
Coord
A cartesian coordinate in 2D space.
Definition: coord.h:25
DelaunayTriangulator::permutation_
od_int64 * permutation_
Definition: delaunay.h:172
Triangle2DInterpolator::triangles_
const DAGTriangleTree & triangles_
Definition: delaunay.h:205
Triangle2DInterpolator::setFromAzimuth
bool setFromAzimuth(const TypeSet< int > &tmpvertices, const Coord &, TypeSet< int > &vertices, TypeSet< double > &weights)
DelaunayTriangulator::setCalcScope
void setCalcScope(const Interval< int > &rg)
DelaunayTriangulator::dataIsRandom
void dataIsRandom(bool yn)
Definition: delaunay.h:156
DelaunayTriangulator::maxNrThreads
int maxNrThreads() const
Definition: delaunay.h:162
DAGTriangleTree::coordlist_
TypeSet< Coord > * coordlist_
Definition: delaunay.h:135
DAGTriangleTree::cIsInside
static char cIsInside()
Definition: delaunay.h:91
DelaunayTriangulator::~DelaunayTriangulator
~DelaunayTriangulator()
DAGTriangleTree::insertPoint
int insertPoint(const Coord &, int &dupid)
DAGTriangleTree::epsilon_
double epsilon_
Definition: delaunay.h:132
Triangle2DInterpolator::Triangle2DInterpolator
Triangle2DInterpolator(const DAGTriangleTree &)
Triangle2DInterpolator::cornerweights2_
TypeSet< double > cornerweights2_
Definition: delaunay.h:211
DAGTriangleTree::init
bool init()
Triangle2DInterpolator::perimeterazimuth_
TypeSet< double > perimeterazimuth_
Definition: delaunay.h:215
DelaunayTriangulator::uiMessage
uiString uiMessage() const
will be message() again in 7.x
Definition: delaunay.h:170
ParallelTask
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:66
DAGTriangleTree::isInside
char isInside(const Coord &pt, int ti, int &dupid) const
DAGTriangleTree::getTriangle
bool getTriangle(const Coord &, int &dupid, TypeSet< int > &vertexindices) const
DelaunayTriangulator::israndom_
bool israndom_
Definition: delaunay.h:173
trigonometry.h
uiString
String that is able to hold international (UTF-8) strings for the user interface.
Definition: uistring.h:121
DAGTriangleTree::cIsDuplicate
static char cIsDuplicate()
Definition: delaunay.h:92
DAGTriangleTree::dumpTo
void dumpTo(od_ostream &) const
Dumps all triangles to stream;.
Triangle2DInterpolator::corner2_
TypeSet< int > corner2_
Definition: delaunay.h:210
Geom::Point2D::y
T y
Definition: geometry.h:68
DAGTriangleTree::cNoTriangle
static int cNoTriangle()
Definition: delaunay.h:95
DelaunayTriangulator::doPrepare
bool doPrepare(int)
DAGTriangleTree::cNoVertex
static int cNoVertex()
Definition: delaunay.h:86
Triangle2DInterpolator::initcenter_
Coord initcenter_
Definition: delaunay.h:212
DAGTriangleTree::getCoordIndices
bool getCoordIndices(TypeSet< int > &) const
DAGTriangleTree::cIsOutside
static char cIsOutside()
Definition: delaunay.h:90
Geom::Point2D::x
T x
Definition: geometry.h:67
mUdf
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:274
DelaunayTriangulator::DelaunayTriangulator
DelaunayTriangulator(DAGTriangleTree &)
OD::PtrPolicy
PtrPolicy
Definition: odmemory.h:21
pointInTriangle2D
bool pointInTriangle2D(const Coord &p, const Coord &a, const Coord &b, const Coord &c, double epsilon)
Definition: trigonometry.h:186
DAGTriangleTree::coordList
const TypeSet< Coord > & coordList() const
Definition: delaunay.h:48
DAGTriangleTree::getConnections
bool getConnections(int pointidx, TypeSet< int > &) const
DAGTriangleTree::searchChild
int searchChild(int v0, int v1, int ti) const
DAGTriangleTree::DAGTriangle
Definition: delaunay.h:116
DAGTriangleTree::setBBox
bool setBBox(const Interval< double > &xrg, const Interval< double > &yrg)
Interval< double >
DAGTriangleTree::getSurroundingIndices
bool getSurroundingIndices(TypeSet< int > &) const
DelaunayTriangulator::mODTextTranslationClass
mODTextTranslationClass(DelaunayTriangulator)
thread.h
DAGTriangleTree::splitTriangleInside
void splitTriangleInside(int ci, int ti)
od_ostream
OD class for stream write common access to the user log file, or std::cout in other than od_main.
Definition: od_ostream.h:26
Triangle2DInterpolator::corner1_
TypeSet< int > corner1_
Definition: delaunay.h:208
Triangle2DInterpolator::computeWeights
bool computeWeights(const Coord &, TypeSet< int > &vertices, TypeSet< double > &weights, double maxdist=mUdf(double), bool dointerpolate=true)
DAGTriangleTree::searchFurther
char searchFurther(const Coord &pt, int &nti0, int &dupid) const
DAGTriangleTree::DAGTriangle::DAGTriangle
DAGTriangle()
DAGTriangleTree::triangles_
TypeSet< DAGTriangle > triangles_
Definition: delaunay.h:133
DAGTriangleTree::cInitVertex0
static int cInitVertex0()
Definition: delaunay.h:96
TypeSet< Coord >
DAGTriangleTree::setEpsilon
void setEpsilon(double err)
Definition: delaunay.h:79
DAGTriangleTree::insertPoint
bool insertPoint(int pointidx, int &dupid)
coord.h

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