 |
OpendTect
6.6
|
Go to the documentation of this file.
30 : closed_(true), udf_(
Geom::Point2D<T>::udf())
34 : poly_(plg), closed_(true)
35 , udf_(
Geom::Point2D<T>::udf())
39 bool isEmpty()
const {
return poly_.isEmpty(); }
41 int size()
const {
return poly_.size(); }
42 bool validIdx(
int idx)
const {
return poly_.validIdx(idx); }
50 bool inclborder,T eps)
const;
84 double area()
const {
return fabs(sgnArea2<double>()/2.0); }
91 double* fractionptr=0)
const;
97 {
return poly_.size()>plg.
size(); }
143 double* fractionptr=0 );
154 template <
class T>
inline
157 if ( data() != poly.
data() )
return false;
162 template <
class T>
inline
165 for (
int idx=0; idx<size(); idx++ )
168 ts += forx ? vtx.
x : vtx.
y;
173 template <
class T>
inline
181 ts.erase(); poly.
getData(
false, ts );
186 template <
class T>
inline
202 const int sz = tsx.size() > tsy.size() ? tsy.size() : tsx.size();
203 for (
int idx=0; idx<sz; idx++ )
208 template <
class T>
inline
211 if ( idx>=0 && idx<=size() )
212 poly_.insert( idx, vtx );
218 template <
class T>
inline
227 template <
class T>
inline
236 template <
class T>
inline
239 if ( poly_.validIdx(idx) )
240 poly_.removeSingle( idx );
246 template <
class T>
inline
248 {
return poly_.validIdx(idx) ? poly_[idx] : udf_; }
251 template <
class T>
inline
253 {
return getVertex( idx+1<size() ? idx+1 : 0 ); }
256 template <
class T>
inline
258 {
return getVertex( idx ? idx-1 : size()-1 ); }
261 template <
class T>
inline
264 if ( poly_.isEmpty() )
return Interval<T>( udf_.x, udf_.y );
269 ret.start = ret.stop = forx ? vtx0.
x : vtx0.
y;
270 for (
int idx=1; idx<size(); idx++ )
273 const T val = forx ? vtx.
x : vtx.
y;
274 if ( val < ret.start ) ret.start = val;
275 else if ( val > ret.stop ) ret.stop = val;
285 template <
class T>
inline
287 bool inclborder, T eps )
const
289 const T abseps = eps<0 ? -eps : eps;
291 (xrg_.start>point.
x+abseps || xrg_.stop<point.
x-abseps)) ||
293 (yrg_.start>point.
y+abseps || yrg_.stop<point.
y-abseps)) )
298 bool nrcrossingsodd =
false;
299 for (
int idx=0; idx<size(); idx++ )
304 if ( isOnSegment(point, vtxcurr, vtxnext, eps) )
306 if ( isEdgeCrossing(arbitrarydir, point, vtxcurr, vtxnext) )
307 nrcrossingsodd = !nrcrossingsodd;
310 return nrcrossingsodd;
314 template <
class T>
inline
319 for (
int idx=0; idx<size(); idx++ )
324 if ( doSegmentsMeet(pt1, pt2, vtxcurr, vtxnext, eps) )
332 template <
class T>
inline
343 return isInside( window, eps );
347 template <
class T>
inline
353 for (
int idx=0; idx<size(); idx++ )
362 if ( isInside(testpoly.
poly_[0],
false, eps) )
365 return testpoly.
isInside(poly_[0],
false, eps) ? 1 : 0;
369 template <
class T>
inline
372 const int startidx = isClosed() ? size()-1 : size()-2;
373 for (
int idx=startidx; idx>=0; idx-- )
375 if ( poly_[idx]==nextVertex(idx) && size()>1 )
381 template <
class T>
inline
384 if ( !validIdx(idx) || ( !isClosed() && (idx==0 || idx==size()-1) ) )
390 return vec1.
x*vec2.
y-vec1.
y*vec2.
x==0 && vec1.
x*vec2.
x+vec1.
y*vec2.
y>0;
394 template <
class T>
inline
401 for (
int idx=0; idx<stopidx; idx++ )
409 for (
int idy=0; idy<stopidx; idy++ )
411 const int dif = abs( idx-idy );
412 if ( dif<=1 || dif>=plg.
size()-1 )
418 if ( vtxcurr==pt1 || vtxcurr==pt2 )
421 if ( isEdgeCrossing(vtxnext-vtxcurr, vtxcurr, pt1, pt2) &&
422 isEdgeCrossing(vtxcurr-vtxnext, vtxnext, pt1, pt2) )
430 template <
class T>
inline
437 if ( isOnSegment(p1, q1, q2, eps) || isOnSegment(p2, q1, q2, eps) ||
438 isOnSegment(q1, p1, p2, eps) || isOnSegment(q2, p1, p2, eps) )
441 if ( p1==p2 || q1==q2 || !isEdgeCrossing(p2-p1, p1, q1, q2) ||
442 !isEdgeCrossing(p1-p2, p2, q1, q2) )
449 template <
class T>
inline
455 return isOnHalfLine( pt, pt1-pt0, pt0, eps ) &&
456 isOnHalfLine( pt, pt0-pt1, pt1, eps );
460 template <
class T>
inline
466 if ( doCoincide(point, endvec, eps) )
468 if ( !isOnLine(point, dirvec, endvec, eps) )
471 return isRightOfLine( point, rot90dirvec, endvec );
475 template <
class T>
inline
481 const bool vtx1right = isRightOfLine( vtx1, raydir, raysrc );
482 const bool vtx2right = isRightOfLine( vtx2, raydir, raysrc );
484 if ( vtx1right && !vtx2right )
485 return !isRightOfLine( raysrc, vtx2-vtx1, vtx1 );
486 if ( !vtx1right && vtx2right )
487 return !isRightOfLine( raysrc, vtx1-vtx2, vtx2 );
492 template <
class T>
inline
498 const double signeddist = sgnDistToLine( point, dirvec, posvec );
499 return signeddist * signeddist <= eps * eps;
502 template <
class T>
inline
507 return sgnDistToLine( point, dirvec, posvec ) > 0;
511 template <
class T>
inline
516 return point1.
sqDistTo( point2 ) <= eps * eps;
520 template <
class T>
inline
525 const double nolinedist = 0;
530 const double substpointinlineeqn =
531 dirvec.
y * ( point.
x - posvec.
x )-dirvec.
x * ( point.
y - posvec.
y );
532 return substpointinlineeqn / dirveclen;
537 template <
class ST>
inline
542 if ( poly_.isEmpty() )
546 for (
int idx=1; idx<size()-1; idx++ )
550 area2 += (ST) ( (pt1.
x-pt0.
x) * (pt2.
y-pt0.
y) -
551 (pt2.
x-pt0.
x) * (pt1.
y-pt0.
y) );
558 template <
class T>
inline
569 for (
int idx=1; idx<size(); idx++ )
572 if ( vtx.
x<pivot.
x || (vtx.
x==pivot.
x && vtx.
y<pivot.
y) )
577 for (
int idx=size()-1; idx>=0; idx-- )
579 if ( pivot == poly_[idx] )
581 poly_.removeSingle( idx );
585 for (
int idx=size()-2; idx>=0; idx-- )
588 for (
int idy=size()-1; idy>idx; idy-- )
591 const double dist = sgnDistToLine( vty, vtx-pivot, pivot );
597 poly_.insert( idy+1, vtx );
601 poly_.removeSingle( idx );
607 for (
int idx=size()-3; idx>=0; idx-- )
610 while ( idx<size()-2 )
614 if ( isRightOfLine(vtz, vty-vtx, vtx) )
617 poly_.removeSingle( idx+1 );
628 template <
class T>
inline
631 const int sz = poly_.size();
632 for (
int idx=0; idx<sz/2-1; idx++ )
635 poly_[idx] = poly_[sz-1-idx];
636 poly_[sz-1-idx] = temp;
644 template <
class T>
inline
648 double* fractionptr )
655 const double numerator = dif.
x*(refpt.
x-p1.x) + dif.
y*(refpt.
y-p1.y);
656 frac = numerator / (dif.
x*dif.
x + dif.
y*dif.
y);
668 (T)(p1.
y * (1-frac) + p2.
y * frac) );
669 return refpt.
distTo( pointonseg );
673 template <
class T>
inline
675 int* segmentidxptr,
double* fractionptr )
const
677 const int sz = size();
683 for (
int idx=(isClosed() ? sz-1 : sz-2); idx>=0; idx-- )
688 const double dist = distToSegment( pt1, pt2, refpt, &frac );
690 if ( mindist >= dist )
694 *segmentidxptr = idx;
704 template <
class T>
inline
707 if ( maxrelerr <= 0.0 )
713 const double upperbound =
mMIN( 0.5 * getRange(
true).width(),
714 0.5 * getRange(
false).width() );
719 for (
int idx=0; idx<size(); idx++ )
725 double maxdist = 0.0;
726 for (
int idx=0; idx<poly.
size(); idx++ )
734 double curdist = poly.
distTo( curpt );
735 double gamma = 0.1 * upperbound;
737 for (
int step=0; step<100; step++ )
739 if ( curdist > maxdist )
745 const double delta = 0.0001 * upperbound;
748 const double dist1 = poly.
distTo( pt1 );
749 const double dist2 = poly.
distTo( pt2 );
751 nextpt *= gamma/delta;
760 double nextdist = poly.
distTo( nextpt );
762 if ( nextdist <= curdist )
766 if ( curpt.
distTo(nextpt) <= 2*maxrelerr*curdist )
778 template <
class T>
inline
783 const int sz = size();
787 const int extra = closed_ ? 1 : 0;
790 for (
int idx=-extra; idx<sz+extra; idx++ )
793 coords +=
Coord( vtx.
x, vtx.
y );
800 int bpidx = bendpoints.size()-extra-1;
804 for (
int vtxidx=sz-1; vtxidx>=0; vtxidx-- )
806 if ( bpidx>=0 && vtxidx==bendpoints[bpidx]-extra )
812 if ( closed_ && poly_.size()>1 && poly_.first() != poly_.last() )
813 poly_ += poly_.first();
bool segmentMeetsBorder(const Geom::Point2D< T > &pt1, const Geom::Point2D< T > &pt2, T eps) const
Definition: polygon.h:315
void set(const char *ky, const char *val)
void setEmpty()
Definition: polygon.h:43
(Closed) sequence of connected 2-D coordinates.
Definition: polygon.h:27
static bool isOnHalfLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &endvec, T eps)
Definition: polygon.h:461
bool anticlockwise() const
Definition: polygon.h:86
Interval< T > yrg_
Definition: polygon.h:150
static bool isRightOfLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &posvec)
Definition: polygon.h:503
bool closed_
Definition: polygon.h:146
const TypeSet< int > & bendPoints() const
Definition: bendpointfinder.h:32
void removeZeroLengths()
Definition: polygon.h:370
bool get(const char *, short &) const
Used to find bendpoints in set of XY Coordinates.
Definition: bendpointfinder.h:82
void keepBendPoints(float eps)
Definition: polygon.h:779
int isInside(const ODPolygon &testpoly, T eps=0) const
Definition: polygon.h:348
TypeSet< Geom::Point2D< T > > poly_
Definition: polygon.h:145
void setUdf(Geom::Point2D< T > pt)
Definition: polygon.h:69
bool execute()
Definition: paralleltask.h:70
void remove(int idx)
Definition: polygon.h:237
Geom::Point2D< T > getUdf() const
Definition: polygon.h:70
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:289
Geom::Point2D< T > udf_
Definition: polygon.h:147
void insert(int idx, const Geom::Point2D< T > &vtx)
Definition: polygon.h:209
void usePar(const IOPar &iop, ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:187
#define mDefEps
Definition: commondefs.h:71
static bool isOnLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &posvec, T eps)
Definition: polygon.h:493
int size() const
Definition: polygon.h:41
Interval< T > xrg_
Definition: polygon.h:149
static bool isEdgeCrossing(const Geom::Point2D< T > &raydir, const Geom::Point2D< T > &raysrc, const Geom::Point2D< T > &vtx1, const Geom::Point2D< T > &vtx2)
Definition: polygon.h:476
const TypeSet< Geom::Point2D< T > > & data() const
Definition: polygon.h:71
const Geom::Point2D< T > & getVertex(int idx) const
Definition: polygon.h:247
bool isEmpty(const NLAModel *mdl)
bool isInside(const Geom::Point2D< T > &, bool inclborder, T eps) const
Definition: polygon.h:286
void add(const Geom::Point2D< T > &vtx)
Definition: polygon.h:228
void setClosed(bool yn)
Definition: polygon.h:67
A cartesian coordinate in 2D space.
Definition: coord.h:25
bool remove(const char *)
bool isUTurn(int idx) const
Definition: polygon.h:382
static const char * compKey(const char *, const char *)
The composite key: (a,b) -> a.b.
#define mIsZero(x, eps)
Definition: commondefs.h:66
#define mClass(module)
Definition: commondefs.h:181
void erase()
Definition: polygon.h:219
double distTo(const Point2D< T > &) const
Definition: geometry.h:386
ST sgnArea2() const
Definition: polygon.h:538
const char * buf() const
Definition: odstring.h:46
T sqDistTo(const Point2D< T > &) const
Definition: geometry.h:391
bool validIdx(int idx) const
Definition: polygon.h:42
ODPolygon(const TypeSet< Geom::Point2D< T > > &plg)
Definition: polygon.h:33
const Geom::Point2D< T > & prevVertex(int idx) const
Definition: polygon.h:257
bool isEmpty() const
Definition: polygon.h:39
void fillPar(IOPar &iop, const ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:174
static int doSegmentsMeet(const Geom::Point2D< T > &p1, const Geom::Point2D< T > &p2, const Geom::Point2D< T > &q1, const Geom::Point2D< T > &q2, T eps)
Definition: polygon.h:431
double maxDistToBorderEstimate(double maxrelerr=0.001) const
Definition: polygon.h:705
#define MAXDOUBLE
Definition: commondefs.h:120
OD::String with its own variable length buffer. The buffer has a guaranteed minimum size.
Definition: bufstring.h:40
double area() const
Definition: polygon.h:84
void reverse()
Definition: polygon.h:629
Definition: geometry.h:19
Basic point class.
Definition: geometry.h:27
const char * find(const char *) const
returns null if not found
static double sgnDistToLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &posvec)
Definition: polygon.h:521
bool operator==(const ODPolygon< T > &) const
Definition: polygon.h:155
#define mMIN(x, y)
Definition: commondefs.h:62
static double distToSegment(const Geom::Point2D< T > &p1, const Geom::Point2D< T > &p2, const Geom::Point2D< T > &refpt, double *fractionptr=0)
Definition: polygon.h:645
static bool isOnSegment(const Geom::Point2D< T > &pt, const Geom::Point2D< T > &pt0, const Geom::Point2D< T > &pt1, T eps)
Definition: polygon.h:450
bool operator>(const ODPolygon< T > &plg) const
Definition: polygon.h:96
T y
Definition: geometry.h:68
void setYN(const char *, bool)
T x
Definition: geometry.h:67
const Geom::Point2D< T > & nextVertex(int idx) const
Definition: polygon.h:252
double distTo(const Geom::Point2D< T > &refpt, int *segmentidxptr=0, double *fractionptr=0) const
Definition: polygon.h:674
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:274
bool clockwise() const
Definition: polygon.h:85
bool isClosed() const
Definition: polygon.h:68
Interval< T > getRange(bool of_x) const
Definition: polygon.h:262
void convexHull()
Definition: polygon.h:559
Interval of values.
Definition: commontypes.h:30
bool windowOverlaps(const Interval< T > &xrange, const Interval< T > &yrange, T eps) const
Definition: polygon.h:333
bool getYN(const char *, bool &) const
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:55
ODPolygon()
Definition: polygon.h:29
static bool doCoincide(const Geom::Point2D< T > &point1, const Geom::Point2D< T > &point2, T eps=mDefEps)
Definition: polygon.h:512
void getData(bool of_x, TypeSet< T > &) const
Definition: polygon.h:163
Sets of (small) copyable elements.
Definition: commontypes.h:29
bool isSelfIntersecting() const
Definition: polygon.h:395
Generated at
for the OpendTect
seismic interpretation project.
Copyright (C): dGB Beheer B.V. 1995-2021