OpendTect  6.6
point3d.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: Nanne Hemstra
8  Date: October 2020
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "gendefs.h"
14 #include "geometry.h"
15 
16 namespace Geom
17 {
18 
19 template <class T>
21 {
22 public:
23  Point3D(const Point2D<T>&,T);
24  Point3D(T xx=0,T yy=0, T zz=0);
25 
26  template <class TT>
27  Point3D<T>& setFrom(const Point3D<TT>&);
28 
29  template <class TT>
30  inline void setXY(TT xx,TT yy);
31  inline void setXY(T xx,T yy);
32  inline void setXY(const Point2D<T>&);
33  inline Point2D<T> getXY() const { return Point2D<T>( x_, y_ ); }
34  inline Point3D<T>& zero();
35  inline Point3D<T> operator-() const;
36 
37  inline T& operator[](int idx);
38  inline T operator[](int idx) const;
39 
40  inline bool operator==(const Point3D&) const;
41  inline bool operator!=(const Point3D&) const;
42  inline bool isSameAs(const Point3D& pos,
43  const Point3D& eps) const;
44 
45  inline Point3D<T>& operator+=(T dist);
46  inline Point3D<T>& operator*=(T factor);
47  inline Point3D<T>& operator/=(T den);
48  inline Point3D<T>& operator+=(const Point3D<T>&);
49  inline Point3D<T>& operator-=(const Point3D<T>&);
50  inline Point3D<T> operator+(const Point3D<T>&) const;
51  inline Point3D<T> operator-(const Point3D<T>&) const;
52  inline Point3D<T> operator*(const T factor) const;
53  inline Point3D<T> operator/(const T den) const;
54 
55  inline Point3D<T> scaleBy(const Point3D<T>& factor) const;
56  inline Point3D<T> unScaleBy(const Point3D<T>& denominator) const;
57 
58  inline T dot(const Point3D<T>&) const;
59  inline Point3D<T> cross(const Point3D<T>&) const;
60  inline Point3D<T> normalize() const;
62  inline bool isDefined() const;
63  inline bool isUdf() const { return !isDefined(); }
64  template <class FT> FT abs() const;
65  inline T sqAbs() const;
67  template <class FT> FT distTo(const Point3D<T>&) const;
68  inline T sqDistTo(const Point3D<T>&) const;
70 
71  template <class FT> FT xyDistTo(const Point3D<T>&) const;
73  inline T xySqDistTo(const Point3D<T>&) const;
75  template <class FT> FT xyDistTo(const Point2D<T>&) const;
77  inline T xySqDistTo(const Point2D<T>&) const;
79 
80  BufferString toString() const;
81  BufferString toPrettyString() const { return toString(); }
82 
83  static Point3D<T> udf();
84  void setUdf() { *this = udf(); }
85 
86  T x_;
87  T y_;
88  T z_;
89 };
90 
91 template <class T>
92 inline Point3D<T> operator*( int f, const Point3D<T>& b )
93 { return Point3D<T>(b.x_*f, b.y_*f, b.z_*f ); }
94 
95 template <class T>
96 inline Point3D<T> operator*( double f, const Point3D<T>& b )
97 { return Point3D<T>(b.x_*f, b.y_*f, b.z_*f ); }
98 
99 
100 template <class T>
101 inline Point3D<T> operator*( float f, const Point3D<T>& b )
102 { return Point3D<T>(b.x_*f, b.y_*f, b.z_*f ); }
103 
104 
105 template <class T> inline
107  : x_( p.x_ )
108  , y_( p.y_ )
109  , z_( z )
110 {}
111 
112 
113 template <class T> inline
114 Point3D<T>::Point3D( T x, T y, T z)
115  : x_( x )
116  , y_( y )
117  , z_( z )
118 {}
119 
120 
121 template <class T> template <class TT> inline
123 { x_=(T)a.x_; y_=(T)a.y_; z_=(T)a.z_; return *this;}
124 
125 
126 template <class T> template <class TT> inline
127 void Point3D<T>::setXY( TT xx, TT yy )
128 { x_ = (T)xx; y_ = (T)yy; }
129 
130 
131 template <class T> inline
132 void Point3D<T>::setXY( T xx, T yy )
133 { x_ = xx ; y_ = yy; }
134 
135 
136 template <class T> inline
138 { x_ = p.x_ ; y_ = p.y_; }
139 
140 template <class T> inline
142 {
143  x_ = y_ = z_ = 0;
144  return *this;
145 }
146 
147 
148 
149 template <class T> inline
150 bool Point3D<T>::operator==( const Point3D<T>& b ) const
151 {
152  const T dx = x_-b.x_;
153  const T dy = y_-b.y_;
154  const T dz = z_-b.z_;
155  return mIsZero(dx,mDefEps) && mIsZero(dy,mDefEps) && mIsZero(dz,mDefEps);
156 }
157 
158 
159 template <class T> inline
160 bool Point3D<T>::operator!=( const Point3D<T>& oth ) const
161 {
162  return !(*this==oth);
163 }
164 
165 
166 template <class T> inline
168  const Point3D<T>& eps ) const
169 {
170  return fabs(x_-pos.x_)<eps.x_ &&
171  fabs(y_-pos.y_)<eps.y_ &&
172  fabs(z_-pos.z_)<eps.z_;
173 }
174 
175 
176 template <class T> inline
178 {
179  if ( isUdf() )
180  return BufferString( "<undef>" );
181  BufferString res( "(", x_, "," );
182  res.add( y_ ).add( "," ).add( z_ ).add( ')' );
183  return res;
184 }
185 
186 
187 template <> inline
189 {
190  if ( !isDefined() )
191  return toString();
192 
194  mRounded(od_int64,z_) );
195  return pt.toString();
196 }
197 
198 
199 template <> inline
201 {
203  mRounded(od_int64,z_) );
204  return pt.toString();
205 }
206 
207 
208 template <class T> inline
210 {
211  if ( !idx )
212  return x_;
213  if ( idx==1 )
214  return y_;
215  return z_;
216 }
217 
218 template <class T> inline
219 T Point3D<T>::operator[]( int idx ) const
220 {
221  if ( !idx )
222  return x_;
223  if ( idx==1 )
224  return y_;
225  return z_;
226 }
227 
228 
229 template <class T> inline
231 {
232  return !Values::isUdf(x_) && !Values::isUdf(y_) && !Values::isUdf(z_);
233 }
234 
235 
236 template <class T>
238 {
239  return Point3D<T>( x_+p.x_, y_+p.y_, z_+p.z_ );
240 }
241 
242 
243 template <class T>
245 {
246  return Point3D<T>( x_-p.x_, y_-p.y_, z_-p.z_ );
247 }
248 
249 template <class T>
251 {
252  return Point3D<T>( -x_, -y_, -z_ );
253 }
254 
255 template <class T>
256 inline Point3D<T> Point3D<T>::operator*( T factor ) const
257 { return Point3D<T>( x_*factor, y_*factor, z_*factor ); }
258 
259 
260 template <class T>
261 inline Point3D<T> Point3D<T>::operator/( T denominator ) const
262 { return Point3D<T>( x_/denominator, y_/denominator, z_/denominator ); }
263 
264 
265 template <class T>
266 inline Point3D<T> Point3D<T>::scaleBy( const Point3D<T>& factor ) const
267 { return Point3D<T>( x_*factor.x_, y_*factor.y_, z_*factor.z_ ); }
268 
269 
270 template <class T>
271 inline Point3D<T>
272 Point3D<T>::unScaleBy( const Point3D<T>& denominator ) const
273 { return Point3D<T>( x_/denominator.x_,
274  y_/denominator.y_,
275  z_/denominator.z_ );
276 }
277 
278 
279 template <class T> inline
281 {
282  x_ += dist; y_ += dist; z_ += dist; return *this;
283 }
284 
285 template <class T> inline
287 {
288  x_ += p.x_; y_ += p.y_; z_ += p.z_;
289  return *this;
290 }
291 
292 
293 template <class T> inline
295 {
296  x_ -= p.x_; y_ -= p.y_; z_ -= p.z_;
297  return *this;
298 }
299 
300 
301 template <class T> inline
303 {
304  x_ *= factor; y_ *= factor; z_ *= factor;
305  return *this;
306 }
307 
308 
309 template <class T> inline
311 {
312  x_ /= denominator; y_ /= denominator; z_ /= denominator;
313  return *this;
314 }
315 
316 
317 template <class T> inline
318 T Point3D<T>::dot(const Point3D<T>& b) const
319 { return x_*b.x_ + y_*b.y_ + z_*b.z_; }
320 
321 
322 
323 template <class T> inline
325 { return Point3D<T>( y_*b.z_-z_*b.y_, z_*b.x_-x_*b.z_, x_*b.y_-y_*b.x_ ); }
326 
327 
328 template <class T> inline
330 {
331  const T sqabsval = sqAbs();
332  if ( sqabsval == 0 )
333  return *this;
334 
335  return *this / Math::Sqrt( sqabsval );
336 }
337 
338 
339 template <class T> template <class FT> inline
340 FT Point3D<T>::abs() const
341 { return ::Math::Sqrt( (FT) sqAbs() ); }
342 
343 
344 template <class T> inline
346 {
347  return x_*x_ + y_*y_ + z_*z_;
348 }
349 
350 
351 template <class T> template <class FT> inline
352 FT Point3D<T>::distTo( const Point3D<T>& pt ) const
353 { return ::Math::Sqrt( (FT)sqDistTo(pt) ); }
354 
355 
356 template <class T> inline
357 T Point3D<T>::sqDistTo( const Point3D<T>& pt ) const
358 {
359  const T xdiff = x_-pt.x_;
360  const T ydiff = y_-pt.y_;
361  const T zdiff = z_-pt.z_;
362  return xdiff*xdiff + ydiff*ydiff + zdiff*zdiff;
363 }
364 
365 
366 template <class T> template <class FT> inline
367 FT Point3D<T>::xyDistTo( const Point3D<T>& pt ) const
368 { return ::Math::Sqrt( (FT)xySqDistTo(pt) ); }
369 
370 
371 template <class T> inline
372 T Point3D<T>::xySqDistTo( const Point3D<T>& pt ) const
373 {
374  return xySqDistTo( pt.getXY() );
375 }
376 
377 template <class T> template <class FT> inline
378 FT Point3D<T>::xyDistTo( const Point2D<T>& pt ) const
379 { return ::Math::Sqrt( (FT)xySqDistTo(pt) ); }
380 
381 
382 template <class T> inline
383 T Point3D<T>::xySqDistTo( const Point2D<T>& pt ) const
384 {
385  return getXY().sqDistTo( pt );
386 }
387 
388 
389 template <class T> inline
391 { return Point3D<T>(mUdf(T),mUdf(T), mUdf(T)); }
392 
393 } // namespace Geom
Geom::Point3D::dot
T dot(const Point3D< T > &) const
Definition: point3d.h:318
BufferString::add
BufferString & add(char)
Geom::Point3D::udf
static Point3D< T > udf()
Definition: point3d.h:390
Geom::Point3D::isUdf
bool isUdf() const
Definition: point3d.h:63
geometry.h
Geom::Point3D::operator*=
Point3D< T > & operator*=(T factor)
Definition: point3d.h:302
Geom::Point3D::operator/=
Point3D< T > & operator/=(T den)
Definition: point3d.h:310
Geom::Point3D::operator==
bool operator==(const Point3D &) const
Definition: point3d.h:150
Geom::Point3D::operator-
Point3D< T > operator-() const
Definition: point3d.h:250
Geom::Point3D::operator*
Point3D< T > operator*(const T factor) const
Definition: point3d.h:256
od_int64
#define od_int64
Definition: plftypes.h:35
mDefEps
#define mDefEps
Definition: commondefs.h:71
Geom::Point3D::distTo
FT distTo(const Point3D< T > &) const
Definition: point3d.h:352
mRounded
#define mRounded(typ, x)
Definition: commondefs.h:57
Geom::Point3D
Definition: point3d.h:21
operator==
bool operator==(const ArrayNDInfo &a1, const ArrayNDInfo &a2)
Definition: arrayndinfo.h:81
Geom::Point3D::operator-=
Point3D< T > & operator-=(const Point3D< T > &)
Definition: point3d.h:294
Geom::Point3D::setFrom
Point3D< T > & setFrom(const Point3D< TT > &)
Definition: point3d.h:122
Geom::Point3D::operator/
Point3D< T > operator/(const T den) const
Definition: point3d.h:261
Values::isUdf
bool isUdf(const T &t)
Definition: undefval.h:245
Geom::Point3D::y_
T y_
Definition: point3d.h:87
mIsZero
#define mIsZero(x, eps)
Definition: commondefs.h:66
Geom::Point3D::operator+=
Point3D< T > & operator+=(T dist)
Definition: point3d.h:280
operator!=
bool operator!=(const ArrayNDInfo &a1, const ArrayNDInfo &a2)
Definition: arrayndinfo.h:90
mClass
#define mClass(module)
Definition: commondefs.h:181
gendefs.h
Geom::Point3D::setUdf
void setUdf()
Definition: point3d.h:84
Geom::Point3D::operator[]
T & operator[](int idx)
Definition: point3d.h:209
Geom::Point3D::operator!=
bool operator!=(const Point3D &) const
Definition: point3d.h:160
Geom::Point3D::z_
T z_
Definition: point3d.h:88
BufferString
OD::String with its own variable length buffer. The buffer has a guaranteed minimum size.
Definition: bufstring.h:40
Geom
Definition: geometry.h:19
Geom::Point2D
Basic point class.
Definition: geometry.h:27
operator-
int operator-(const DateInfo &di1, const DateInfo &di2)
Definition: dateinfo.h:128
Geom::Point3D::xyDistTo
FT xyDistTo(const Point3D< T > &) const
Distance in the xy plane.
Definition: point3d.h:367
Geom::Point3D::operator+
Point3D< T > operator+(const Point3D< T > &) const
Definition: point3d.h:237
Geom::Point3D::isSameAs
bool isSameAs(const Point3D &pos, const Point3D &eps) const
Definition: point3d.h:167
Geom::Point3D::toPrettyString
BufferString toPrettyString() const
Definition: point3d.h:81
Geom::Point3D::abs
FT abs() const
Definition: point3d.h:340
Geom::Point3D::xySqDistTo
T xySqDistTo(const Point3D< T > &) const
Square distance in the xy plane.
Definition: point3d.h:372
mUdf
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:274
Geom::Point3D::cross
Point3D< T > cross(const Point3D< T > &) const
Definition: point3d.h:324
Geom::Point3D::normalize
Point3D< T > normalize() const
Returns vector with length one.
Definition: point3d.h:329
Geom::Point3D::zero
Point3D< T > & zero()
Definition: point3d.h:141
Geom::Point3D::sqAbs
T sqAbs() const
Squared absolute value.
Definition: point3d.h:345
Geom::Point3D::unScaleBy
Point3D< T > unScaleBy(const Point3D< T > &denominator) const
Definition: point3d.h:272
Geom::Point3D::setXY
void setXY(TT xx, TT yy)
Definition: point3d.h:127
Math::Sqrt
float Sqrt(float)
Geom::Point3D::sqDistTo
T sqDistTo(const Point3D< T > &) const
Squared distance.
Definition: point3d.h:357
Geom::operator*
Point3D< T > operator*(int f, const Point3D< T > &b)
Definition: point3d.h:92
Geom::Point3D::x_
T x_
Definition: point3d.h:86
Geom::Point3D::toString
BufferString toString() const
Definition: point3d.h:177
toString
BufferString toString(const BufferStringSet &bss)
Definition: bufstringset.h:156
Geom::Point3D::Point3D
Point3D(const Point2D< T > &, T)
Definition: point3d.h:106
Geom::Point3D::isDefined
bool isDefined() const
Definition: point3d.h:230
Geom::Point3D::getXY
Point2D< T > getXY() const
Definition: point3d.h:33
Geom::Point3D::scaleBy
Point3D< T > scaleBy(const Point3D< T > &factor) const
Definition: point3d.h:266

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