29 : closed_(true), udf_(
Geom::Point2D<T>::udf())
33 : poly_(plg), closed_(true)
34 , udf_(
Geom::Point2D<T>::udf())
41 bool isEmpty()
const {
return poly_.isEmpty(); }
43 int size()
const {
return poly_.size(); }
44 bool validIdx(
int idx)
const {
return poly_.validIdx(idx); }
52 bool inclborder,T eps)
const;
54 int isInside(
const ODPolygon& testpoly,T eps=0)
const;
78 void removeZeroLengths();
79 bool isUTurn(
int idx)
const;
80 bool isSelfIntersecting()
const;
83 void keepBendPoints(
float eps);
86 double area()
const {
return fabs(sgnArea2<double>()/2.0); }
93 double* fractionptr=0)
const;
95 double maxDistToBorderEstimate(
double maxrelerr=0.001)
const;
99 {
return poly_.size()>plg.
size(); }
140 template <
class ST> ST sgnArea2()
const;
145 double* fractionptr=0 );
156 template <
class T>
inline 159 if ( data() != poly.
data() )
return false;
164 template <
class T>
template <
class T2>
167 for (
int idx=0; idx<oth.
size(); idx++ )
175 template <
class T>
inline 178 for (
int idx=0; idx<size(); idx++ )
181 ts += forx ? vtx.
x_ : vtx.
y_;
186 template <
class T>
inline 199 template <
class T>
inline 216 for (
int idx=0; idx<sz; idx++ )
221 template <
class T>
inline 224 if ( idx>=0 && idx<=size() )
225 poly_.insert( idx, vtx );
231 template <
class T>
inline 240 template <
class T>
inline 249 template <
class T>
inline 252 if ( poly_.validIdx(idx) )
253 poly_.removeSingle( idx );
259 template <
class T>
inline 261 {
return poly_.validIdx(idx) ? poly_[idx] : udf_; }
264 template <
class T>
inline 266 {
return getVertex( idx+1<size() ? idx+1 : 0 ); }
269 template <
class T>
inline 271 {
return getVertex( idx ? idx-1 : size()-1 ); }
274 template <
class T>
inline 277 if ( poly_.isEmpty() )
return Interval<T>( udf_.x_, udf_.y_ );
283 for (
int idx=1; idx<size(); idx++ )
286 const T val = forx ? vtx.
x_ : vtx.
y_;
288 else if ( val > ret.
stop ) ret.
stop = val;
298 template <
class T>
inline 300 bool inclborder, T eps )
const 302 const T abseps = eps<0 ? -eps : eps;
304 (xrg_.start>point.
x_+abseps || xrg_.stop<point.
x_-abseps)) ||
306 (yrg_.start>point.
y_+abseps || yrg_.stop<point.
y_-abseps)) )
311 bool nrcrossingsodd =
false;
312 for (
int idx=0; idx<size(); idx++ )
317 if ( isOnSegment(point, vtxcurr, vtxnext, eps) )
319 if ( isEdgeCrossing(arbitrarydir, point, vtxcurr, vtxnext) )
320 nrcrossingsodd = !nrcrossingsodd;
323 return nrcrossingsodd;
327 template <
class T>
inline 332 for (
int idx=0; idx<size(); idx++ )
337 if ( doSegmentsMeet(pt1, pt2, vtxcurr, vtxnext, eps) )
345 template <
class T>
inline 356 return isInside( window, eps );
360 template <
class T>
inline 366 for (
int idx=0; idx<size(); idx++ )
375 if ( isInside(testpoly.
poly_[0],
false, eps) )
378 return testpoly.
isInside(poly_[0],
false, eps) ? 1 : 0;
382 template <
class T>
inline 385 const int startidx = isClosed() ? size()-1 : size()-2;
386 for (
int idx=startidx; idx>=0; idx-- )
388 if ( poly_[idx]==nextVertex(idx) && size()>1 )
394 template <
class T>
inline 397 if ( !validIdx(idx) || ( !isClosed() && (idx==0 || idx==size()-1) ) )
403 return vec1.
x_*vec2.
y_-vec1.
y_*vec2.
x_==0 &&
408 template <
class T>
inline 415 for (
int idx=0; idx<stopidx; idx++ )
423 for (
int idy=0; idy<stopidx; idy++ )
425 const int dif = abs( idx-idy );
426 if ( dif<=1 || dif>=plg.
size()-1 )
432 if ( vtxcurr==pt1 || vtxcurr==pt2 )
435 if ( isEdgeCrossing(vtxnext-vtxcurr, vtxcurr, pt1, pt2) &&
436 isEdgeCrossing(vtxcurr-vtxnext, vtxnext, pt1, pt2) )
444 template <
class T>
inline 451 if ( isOnSegment(p1, q1, q2, eps) || isOnSegment(p2, q1, q2, eps) ||
452 isOnSegment(q1, p1, p2, eps) || isOnSegment(q2, p1, p2, eps) )
455 if ( p1==p2 || q1==q2 || !isEdgeCrossing(p2-p1, p1, q1, q2) ||
456 !isEdgeCrossing(p1-p2, p2, q1, q2) )
463 template <
class T>
inline 469 return isOnHalfLine( pt, pt1-pt0, pt0, eps ) &&
470 isOnHalfLine( pt, pt0-pt1, pt1, eps );
474 template <
class T>
inline 480 if ( doCoincide(point, endvec, eps) )
482 if ( !isOnLine(point, dirvec, endvec, eps) )
485 return isRightOfLine( point, rot90dirvec, endvec );
489 template <
class T>
inline 495 const bool vtx1right = isRightOfLine( vtx1, raydir, raysrc );
496 const bool vtx2right = isRightOfLine( vtx2, raydir, raysrc );
498 if ( vtx1right && !vtx2right )
499 return !isRightOfLine( raysrc, vtx2-vtx1, vtx1 );
500 if ( !vtx1right && vtx2right )
501 return !isRightOfLine( raysrc, vtx1-vtx2, vtx2 );
506 template <
class T>
inline 512 const double signeddist = sgnDistToLine( point, dirvec, posvec );
513 return signeddist * signeddist <= eps * eps;
516 template <
class T>
inline 521 return sgnDistToLine( point, dirvec, posvec ) > 0;
525 template <
class T>
inline 530 return point1.
sqDistTo( point2 ) <= eps * eps;
534 template <
class T>
inline 539 const double nolinedist = 0;
541 const double dirveclen =
545 const double substpointinlineeqn =
546 dirvec.
y_ * (point.
x_-posvec.
x_) - dirvec.
x_ * (point.
y_-posvec.
y_);
547 return substpointinlineeqn / dirveclen;
552 template <
class ST>
inline 558 for (
int idx=1; idx<size()-1; idx++ )
562 area2 += (ST) ( (pt1.
x_-pt0.
x_) * (pt2.
y_-pt0.
y_) -
563 (pt2.
x_-pt0.
x_) * (pt1.
y_-pt0.
y_) );
570 template <
class T>
inline 581 for (
int idx=1; idx<size(); idx++ )
584 if ( vtx.
x_<pivot.
x_ || (vtx.
x_==pivot.
x_ && vtx.
y_<pivot.
y_) )
589 for (
int idx=size()-1; idx>=0; idx-- )
591 if ( pivot == poly_[idx] )
593 poly_.removeSingle( idx );
597 for (
int idx=size()-2; idx>=0; idx-- )
600 for (
int idy=size()-1; idy>idx; idy-- )
603 const double dist = sgnDistToLine( vty, vtx-pivot, pivot );
609 poly_.insert( idy+1, vtx );
613 poly_.removeSingle( idx );
619 for (
int idx=size()-3; idx>=0; idx-- )
622 while ( idx<size()-2 )
626 if ( isRightOfLine(vtz, vty-vtx, vtx) )
629 poly_.removeSingle( idx+1 );
640 template <
class T>
inline 643 const int sz = poly_.size();
644 for (
int idx=0; idx<sz/2-1; idx++ )
647 poly_[idx] = poly_[sz-1-idx];
648 poly_[sz-1-idx] = temp;
656 template <
class T>
inline 660 double* fractionptr )
667 const double numerator = dif.
x_*(refpt.
x_-p1.x_) +
668 dif.
y_*(refpt.
y_-p1.y_);
669 frac = numerator / (dif.
x_*dif.
x_ + dif.
y_*dif.
y_);
681 (T)(p1.
y_ * (1-frac) + p2.
y_ * frac) );
682 return refpt.template distTo<double>( pointonseg );
686 template <
class T>
inline 688 int* segmentidxptr,
double* fractionptr )
const 690 const int sz = size();
696 for (
int idx=(isClosed() ? sz-1 : sz-2); idx>=0; idx-- )
701 const double dist = distToSegment( pt1, pt2, refpt, &frac );
703 if ( mindist >= dist )
707 *segmentidxptr = idx;
717 template <
class T>
inline 720 if ( maxrelerr <= 0.0 )
726 const double upperbound =
mMIN( 0.5 * getRange(
true).width(),
727 0.5 * getRange(
false).width() );
732 for (
int idx=0; idx<size(); idx++ )
738 double maxdist = 0.0;
739 for (
int idx=0; idx<poly.
size(); idx++ )
747 double curdist = poly.
distTo( curpt );
748 double gamma = 0.1 * upperbound;
750 for (
int step=0; step<100; step++ )
752 if ( curdist > maxdist )
758 const double delta = 0.0001 * upperbound;
761 const double dist1 = poly.
distTo( pt1 );
762 const double dist2 = poly.
distTo( pt2 );
764 nextpt *= gamma/delta;
773 double nextdist = poly.
distTo( nextpt );
775 if ( nextdist <= curdist )
779 if ( curpt.
distTo<
double>(nextpt) <= 2*maxrelerr*curdist )
791 template <
class T>
inline 796 const int sz = size();
800 const int extra = closed_ ? 1 : 0;
803 for (
int idx=-extra; idx<sz+extra; idx++ )
813 int bpidx = bendpoints.
size()-extra-1;
817 for (
int vtxidx=sz-1; vtxidx>=0; vtxidx-- )
819 if ( bpidx>=0 && vtxidx==bendpoints[bpidx]-extra )
825 if ( closed_ && poly_.size()>1 && poly_.first() != poly_.last() )
826 poly_ += poly_.first();
const Geom::Point2D< T > & getVertex(int idx) const
Definition: polygon.h:260
bool isInside(const Geom::Point2D< T > &, bool inclborder, T eps) const
Definition: polygon.h:299
void remove(int idx)
Definition: polygon.h:250
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
void erase()
Definition: polygon.h:232
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:490
void keepBendPoints(float eps)
Definition: polygon.h:792
bool isEmpty() const
Definition: polygon.h:41
bool clockwise() const
Definition: polygon.h:87
bool operator==(const ArrayNDInfo &a1, const ArrayNDInfo &a2)
Definition: arrayndinfo.h:51
const TypeSet< int > & bendPoints() const
Definition: bendpointfinder.h:31
static bool doCoincide(const Geom::Point2D< T > &point1, const Geom::Point2D< T > &point2, T eps=mDefEps)
Definition: polygon.h:526
bool windowOverlaps(const Interval< T > &xrange, const Interval< T > &yrange, T eps) const
Definition: polygon.h:346
Interval< T > getRange(bool of_x) const
Definition: polygon.h:275
#define mIsZero(x, eps)
Definition: commondefs.h:55
bool closed_
Definition: polygon.h:148
void convexHull()
Definition: polygon.h:571
void usePar(const IOPar &iop, ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:200
void getData(bool of_x, TypeSet< T > &) const
Definition: polygon.h:176
static bool isOnLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &posvec, T eps)
Definition: polygon.h:507
Interval< T > yrg_
Definition: polygon.h:152
static bool isRightOfLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &posvec)
Definition: polygon.h:517
(Closed) sequence of connected 2-D coordinates.
Definition: polygon.h:25
const Geom::Point2D< T > & nextVertex(int idx) const
Definition: polygon.h:265
Used to find bendpoints in set of XY Coordinates.
Definition: bendpointfinder.h:79
TypeSet< Geom::Point2D< T > > poly_
Definition: polygon.h:147
void setUdf(Geom::Point2D< T > pt)
Definition: polygon.h:71
Geom::Point2D< T > udf_
Definition: polygon.h:149
double distTo(const Geom::Point2D< T > &refpt, int *segmentidxptr=0, double *fractionptr=0) const
Definition: polygon.h:687
T sqDistTo(const Point2D< T > &) const
Squared distance.
Definition: geometry.h:634
bool get(const char *, int &) const
ODPolygon(const TypeSet< Geom::Point2D< T > > &plg)
Definition: polygon.h:32
static const char * compKey(const char *, const char *)
The composite key: (a,b) -> a.b.
void add(const Geom::Point2D< T > &vtx)
Definition: polygon.h:241
void setClosed(bool yn)
Definition: polygon.h:69
#define mMIN(x, y)
Definition: commondefs.h:52
Interval of values.
Definition: commontypes.h:27
double area() const
Definition: polygon.h:86
bool validIdx(int idx) const
Definition: polygon.h:44
bool segmentMeetsBorder(const Geom::Point2D< T > &pt1, const Geom::Point2D< T > &pt2, T eps) const
Definition: polygon.h:328
bool operator>(const ODPolygon< T > &plg) const
Definition: polygon.h:98
Set of (small) copyable elements.
Definition: commontypes.h:26
FT distTo(const Point2D< T > &) const
Definition: geometry.h:629
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:53
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
bool execute()
Definition: paralleltask.h:69
const char * find(const char *) const
returns null if not found
bool isClosed() const
Definition: polygon.h:70
bool anticlockwise() const
Definition: polygon.h:88
T x_
Definition: geometry.h:80
void removeZeroLengths()
Definition: polygon.h:383
void setYN(const char *, bool)
void fillPar(IOPar &iop, const ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:187
#define mDefEps
Definition: commondefs.h:60
const char * buf() const
Definition: odstring.h:45
static double distToSegment(const Geom::Point2D< T > &p1, const Geom::Point2D< T > &p2, const Geom::Point2D< T > &refpt, double *fractionptr=0)
Definition: polygon.h:657
static bool isOnSegment(const Geom::Point2D< T > &pt, const Geom::Point2D< T > &pt0, const Geom::Point2D< T > &pt1, T eps)
Definition: polygon.h:464
bool isUTurn(int idx) const
Definition: polygon.h:395
T stop
Definition: ranges.h:91
OD::String with its own variable length buffer. The buffer has a guaranteed minimum size...
Definition: bufstring.h:38
bool isEmpty(const char *)
bool isSelfIntersecting() const
Definition: polygon.h:409
void insert(int idx, const Geom::Point2D< T > &vtx)
Definition: polygon.h:222
Coord2d Coord
Definition: commontypes.h:83
int size() const
Definition: polygon.h:43
void reverse()
Definition: polygon.h:641
bool operator==(const ODPolygon< T > &) const
Definition: polygon.h:157
const Geom::Point2D< T > & prevVertex(int idx) const
Definition: polygon.h:270
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:445
static double sgnDistToLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &posvec)
Definition: polygon.h:535
T start
Definition: ranges.h:90
Interval< T > xrg_
Definition: polygon.h:151
ODPolygon()
Definition: polygon.h:28
Geom::Point2D< T > getUdf() const
Definition: polygon.h:72
const TypeSet< Geom::Point2D< T > > & data() const
Definition: polygon.h:73
ST sgnArea2() const
Definition: polygon.h:553
#define MAXDOUBLE
Definition: commondefs.h:103
Definition: commontypes.h:55
#define mClass(module)
Definition: commondefs.h:161
2D point or vector class.
Definition: commontypes.h:58
void set(const char *ky, const char *val)
double maxDistToBorderEstimate(double maxrelerr=0.001) const
Definition: polygon.h:718
T y_
Definition: geometry.h:81
void setEmpty()
Definition: polygon.h:45
void set(const ODPolygon< T2 > &)
Definition: polygon.h:165
static bool isOnHalfLine(const Geom::Point2D< T > &point, const Geom::Point2D< T > &dirvec, const Geom::Point2D< T > &endvec, T eps)
Definition: polygon.h:475
bool getYN(const char *, bool &) const