QGIS API Documentation 3.34.0-Prizren (ffbdd678812)
Loading...
Searching...
No Matches
qgsrectangle.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsrectangle.h - description
3 -------------------
4 begin : Sat Jun 22 2002
5 copyright : (C) 2002 by Gary E.Sherman
6 email : sherman at mrcc.com
7***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#ifndef QGSRECTANGLE_H
19#define QGSRECTANGLE_H
20
21#include "qgis_core.h"
22#include "qgis.h"
23#include <iosfwd>
24#include <QDomDocument>
25#include <QRectF>
26
27class QString;
28class QRectF;
29class QgsBox3D;
30#include "qgspointxy.h"
31
32
41class CORE_EXPORT QgsRectangle
42{
43 public:
44
46 QgsRectangle() = default; // optimised constructor for null rectangle - no need to call normalize here
47
54 explicit QgsRectangle( double xMin, double yMin = 0, double xMax = 0, double yMax = 0, bool normalize = true ) SIP_HOLDGIL
55 : mXmin( xMin )
56 , mYmin( yMin )
57 , mXmax( xMax )
58 , mYmax( yMax )
59 {
60 if ( normalize )
62 }
63
70 QgsRectangle( const QgsPointXY &p1, const QgsPointXY &p2, bool normalize = true ) SIP_HOLDGIL
71 {
72 set( p1, p2, normalize );
73 }
74
80 QgsRectangle( const QRectF &qRectF ) SIP_HOLDGIL
81 {
82 mXmin = qRectF.topLeft().x();
83 mYmin = qRectF.topLeft().y();
84 mXmax = qRectF.bottomRight().x();
85 mYmax = qRectF.bottomRight().y();
86 }
87
90 {
91 mXmin = other.xMinimum();
92 mYmin = other.yMinimum();
93 mXmax = other.xMaximum();
94 mYmax = other.yMaximum();
95 }
96
97 // IMPORTANT - while QgsRectangle is inherited by QgsReferencedRectangle, we do NOT want a virtual destructor here
98 // because this class MUST be lightweight and we don't want the cost of the vtable here.
99 // see https://github.com/qgis/QGIS/pull/4720#issuecomment-308652392
100 ~QgsRectangle() = default;
101
107 static QgsRectangle fromWkt( const QString &wkt );
108
114 static QgsRectangle fromCenterAndSize( const QgsPointXY &center, double width, double height );
115
122 void set( const QgsPointXY &p1, const QgsPointXY &p2, bool normalize = true )
123 {
124 mXmin = p1.x();
125 mXmax = p2.x();
126 mYmin = p1.y();
127 mYmax = p2.y();
128 if ( normalize )
130 }
131
138 void set( double xMin, double yMin, double xMax, double yMax, bool normalize = true )
139 {
140 mXmin = xMin;
141 mYmin = yMin;
142 mXmax = xMax;
143 mYmax = yMax;
144 if ( normalize )
146 }
147
151 void setXMinimum( double x ) SIP_HOLDGIL { mXmin = x; }
152
156 void setXMaximum( double x ) SIP_HOLDGIL { mXmax = x; }
157
161 void setYMinimum( double y ) SIP_HOLDGIL { mYmin = y; }
162
166 void setYMaximum( double y ) SIP_HOLDGIL { mYmax = y; }
167
179 {
180 mXmin = mYmin = std::numeric_limits<double>::max();
181 mXmax = mYmax = -std::numeric_limits<double>::max();
182 }
183
190 Q_DECL_DEPRECATED void setMinimal() SIP_DEPRECATED
191 {
192 setNull();
193 }
194
198 double xMaximum() const SIP_HOLDGIL { return mXmax; }
199
203 double xMinimum() const SIP_HOLDGIL { return mXmin; }
204
208 double yMaximum() const SIP_HOLDGIL { return mYmax; }
209
213 double yMinimum() const SIP_HOLDGIL { return mYmin; }
214
219 {
220 if ( isNull() )
221 return;
222
223 if ( mXmin > mXmax )
224 {
225 std::swap( mXmin, mXmax );
226 }
227 if ( mYmin > mYmax )
228 {
229 std::swap( mYmin, mYmax );
230 }
231 }
232
238 double width() const SIP_HOLDGIL { return mXmax - mXmin; }
239
245 double height() const SIP_HOLDGIL { return mYmax - mYmin; }
246
254 double area() const SIP_HOLDGIL { return ( mXmax - mXmin ) * ( mYmax - mYmin ); }
255
261 double perimeter() const SIP_HOLDGIL { return 2 * ( mXmax - mXmin ) + 2 * ( mYmax - mYmin ); }
262
266 QgsPointXY center() const SIP_HOLDGIL { return QgsPointXY( mXmax * 0.5 + mXmin * 0.5, mYmin * 0.5 + mYmax * 0.5 ); }
267
271 void scale( double scaleFactor, const QgsPointXY *c = nullptr )
272 {
273 // scale from the center
274 double centerX, centerY;
275 if ( c )
276 {
277 centerX = c->x();
278 centerY = c->y();
279 }
280 else
281 {
282 centerX = mXmin + width() / 2;
283 centerY = mYmin + height() / 2;
284 }
285 scale( scaleFactor, centerX, centerY );
286 }
287
291 void scale( double scaleFactor, double centerX, double centerY )
292 {
293 const double newWidth = width() * scaleFactor;
294 const double newHeight = height() * scaleFactor;
295 mXmin = centerX - newWidth / 2.0;
296 mXmax = centerX + newWidth / 2.0;
297 mYmin = centerY - newHeight / 2.0;
298 mYmax = centerY + newHeight / 2.0;
299 }
300
305 QgsRectangle scaled( double scaleFactor, const QgsPointXY *center = nullptr ) const;
306
311 void grow( double delta )
312 {
313 if ( isNull() )
314 return;
315 mXmin -= delta;
316 mXmax += delta;
317 mYmin -= delta;
318 mYmax += delta;
319 }
320
324 void include( const QgsPointXY &p )
325 {
326 if ( isNull() )
327 {
328 setXMinimum( p.x() );
329 setXMaximum( p.x() );
330 setYMinimum( p.y() );
331 setYMaximum( p.y() );
332 return;
333 }
334 if ( p.x() < xMinimum() )
335 setXMinimum( p.x() );
336 if ( p.x() > xMaximum() )
337 setXMaximum( p.x() );
338 if ( p.y() < yMinimum() )
339 setYMinimum( p.y() );
340 if ( p.y() > yMaximum() )
341 setYMaximum( p.y() );
342 }
343
350 QgsRectangle buffered( double width ) const
351 {
352 if ( isNull() )
353 return QgsRectangle();
354 return QgsRectangle( mXmin - width, mYmin - width, mXmax + width, mYmax + width );
355 }
356
361 {
362 QgsRectangle intersection = QgsRectangle();
363 if ( intersects( rect ) )
364 {
365 intersection.setXMinimum( mXmin > rect.xMinimum() ? mXmin : rect.xMinimum() );
366 intersection.setXMaximum( mXmax < rect.xMaximum() ? mXmax : rect.xMaximum() );
367 intersection.setYMinimum( mYmin > rect.yMinimum() ? mYmin : rect.yMinimum() );
368 intersection.setYMaximum( mYmax < rect.yMaximum() ? mYmax : rect.yMaximum() );
369 }
370 return intersection;
371 }
372
376 bool intersects( const QgsRectangle &rect ) const SIP_HOLDGIL
377 {
378 const double x1 = ( mXmin > rect.mXmin ? mXmin : rect.mXmin );
379 const double x2 = ( mXmax < rect.mXmax ? mXmax : rect.mXmax );
380 if ( x1 > x2 )
381 return false;
382 const double y1 = ( mYmin > rect.mYmin ? mYmin : rect.mYmin );
383 const double y2 = ( mYmax < rect.mYmax ? mYmax : rect.mYmax );
384 return y1 <= y2;
385 }
386
390 bool contains( const QgsRectangle &rect ) const SIP_HOLDGIL
391 {
392 return ( rect.mXmin >= mXmin && rect.mXmax <= mXmax && rect.mYmin >= mYmin && rect.mYmax <= mYmax );
393 }
394
398 bool contains( const QgsPointXY &p ) const SIP_HOLDGIL
399 {
400 return mXmin <= p.x() && p.x() <= mXmax &&
401 mYmin <= p.y() && p.y() <= mYmax;
402 }
403
409 bool contains( double x, double y ) const SIP_HOLDGIL
410 {
411 return mXmin <= x && x <= mXmax &&
412 mYmin <= y && y <= mYmax;
413 }
414
418 void combineExtentWith( const QgsRectangle &rect )
419 {
420 if ( isNull() )
421 *this = rect;
422 else if ( !rect.isNull() )
423 {
424 mXmin = std::min( mXmin, rect.xMinimum() );
425 mXmax = std::max( mXmax, rect.xMaximum() );
426 mYmin = std::min( mYmin, rect.yMinimum() );
427 mYmax = std::max( mYmax, rect.yMaximum() );
428 }
429 }
430
434 void combineExtentWith( double x, double y )
435 {
436 if ( isNull() )
437 *this = QgsRectangle( x, y, x, y );
438 else
439 {
440 mXmin = ( ( mXmin < x ) ? mXmin : x );
441 mXmax = ( ( mXmax > x ) ? mXmax : x );
442
443 mYmin = ( ( mYmin < y ) ? mYmin : y );
444 mYmax = ( ( mYmax > y ) ? mYmax : y );
445 }
446 }
447
452 void combineExtentWith( const QgsPointXY &point )
453 {
454 combineExtentWith( point.x(), point.y() );
455 }
456
461 double distance( const QgsPointXY &point ) const
462 {
463 const double dx = std::max( std::max( mXmin - point.x(), 0.0 ), point.x() - mXmax );
464 const double dy = std::max( std::max( mYmin - point.y(), 0.0 ), point.y() - mYmax );
465 return std::sqrt( dx * dx + dy * dy );
466 }
467
473
479
484 QgsRectangle &operator-=( QgsVector v );
485
490 QgsRectangle &operator+=( QgsVector v );
491
501 bool isEmpty() const
502 {
503 return isNull() || mXmax <= mXmin || mYmax <= mYmin || qgsDoubleNear( mXmax, mXmin ) || qgsDoubleNear( mYmax, mYmin );
504 }
505
515 bool isNull() const
516 {
517 // rectangle created QgsRectangle() or with rect.setNull() or
518 // otherwise having NaN ordinates
519 return ( std::isnan( mXmin ) && std::isnan( mXmax ) && std::isnan( mYmin ) && std::isnan( mYmax ) ) ||
520 ( qgsDoubleNear( mXmin, std::numeric_limits<double>::max() ) && qgsDoubleNear( mYmin, std::numeric_limits<double>::max() ) &&
521 qgsDoubleNear( mXmax, -std::numeric_limits<double>::max() ) && qgsDoubleNear( mYmax, -std::numeric_limits<double>::max() ) );
522 }
523
527 QString asWktCoordinates() const;
528
532 QString asWktPolygon() const;
533
537 QRectF toRectF() const
538 {
539 return QRectF( static_cast< qreal >( mXmin ), static_cast< qreal >( mYmin ), static_cast< qreal >( mXmax - mXmin ), static_cast< qreal >( mYmax - mYmin ) );
540 }
541
547 QString toString( int precision = 16 ) const;
548
552 QString asPolygon() const;
553
558 bool operator==( const QgsRectangle &r1 ) const
559 {
560 if ( isNull() ) return r1.isNull();
561
562 return qgsDoubleNear( r1.xMaximum(), xMaximum() ) &&
563 qgsDoubleNear( r1.xMinimum(), xMinimum() ) &&
564 qgsDoubleNear( r1.yMaximum(), yMaximum() ) &&
565 qgsDoubleNear( r1.yMinimum(), yMinimum() );
566 }
567
572 bool operator!=( const QgsRectangle &r1 ) const
573 {
574 return ( ! operator==( r1 ) );
575 }
576
582 {
583 if ( &r1 != this )
584 {
585 mXmax = r1.xMaximum();
586 mXmin = r1.xMinimum();
587 mYmax = r1.yMaximum();
588 mYmin = r1.yMinimum();
589 }
590
591 return *this;
592 }
593
598 bool isFinite() const
599 {
600 if ( std::isinf( mXmin ) || std::isinf( mYmin ) || std::isinf( mXmax ) || std::isinf( mYmax ) )
601 {
602 return false;
603 }
604 if ( std::isnan( mXmin ) || std::isnan( mYmin ) || std::isnan( mXmax ) || std::isnan( mYmax ) )
605 {
606 return false;
607 }
608 return true;
609 }
610
614 void invert()
615 {
616 std::swap( mXmin, mYmin );
617 std::swap( mXmax, mYmax );
618 }
619
625 QgsBox3D toBox3d( double zMin, double zMax ) const;
626
628 operator QVariant() const
629 {
630 return QVariant::fromValue( *this );
631 }
632
639 QgsRectangle snappedToGrid( double spacing ) const;
640
641#ifdef SIP_RUN
642 SIP_PYOBJECT __repr__();
643 % MethodCode
644 QString str = QStringLiteral( "<QgsRectangle: %1>" ).arg( sipCpp->asWktCoordinates() );
645 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
646 % End
647#endif
648
649 private:
650
651 double mXmin = std::numeric_limits<double>::max();
652 double mYmin = std::numeric_limits<double>::max();
653 double mXmax = -std::numeric_limits<double>::max();
654 double mYmax = -std::numeric_limits<double>::max();
655
656};
657
659
660#ifndef SIP_RUN
661
665CORE_EXPORT QDataStream &operator<<( QDataStream &out, const QgsRectangle &rectangle );
666
670CORE_EXPORT QDataStream &operator>>( QDataStream &in, QgsRectangle &rectangle );
671
672inline std::ostream &operator << ( std::ostream &os, const QgsRectangle &r )
673{
674 return os << r.toString().toLocal8Bit().data();
675}
676
677#endif
678
679#endif // QGSRECTANGLE_H
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:44
A class to represent a 2D point.
Definition qgspointxy.h:59
double y
Definition qgspointxy.h:63
double x
Definition qgspointxy.h:62
A rectangle specified with double values.
QgsRectangle(double xMin, double yMin=0, double xMax=0, double yMax=0, bool normalize=true)
Constructs a QgsRectangle from a set of x and y minimum and maximum coordinates.
QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
Q_DECL_DEPRECATED void setMinimal()
Set a rectangle so that min corner is at max and max corner is at min.
void combineExtentWith(const QgsPointXY &point)
Expands the rectangle so that it covers both the original rectangle and the given point.
QgsRectangle()=default
Constructor for a null rectangle.
double area() const
Returns the area of the rectangle.
void include(const QgsPointXY &p)
Updates the rectangle to include the specified point.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
void combineExtentWith(double x, double y)
Expands the rectangle so that it covers both the original rectangle and the given point.
QgsRectangle(const QgsPointXY &p1, const QgsPointXY &p2, bool normalize=true)
Construct a rectangle from two points.
bool contains(double x, double y) const
Returns true when rectangle contains the point at (x, y).
void setYMinimum(double y)
Set the minimum y value.
bool intersects(const QgsRectangle &rect) const
Returns true when rectangle intersects with other rectangle.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
bool operator!=(const QgsRectangle &r1) const
Comparison operator.
void setXMinimum(double x)
Set the minimum x value.
double width() const
Returns the width of the rectangle.
QRectF toRectF() const
Returns a QRectF with same coordinates as the rectangle.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
bool isNull() const
Test if the rectangle is null (holding no spatial information).
QgsRectangle(const QgsRectangle &other)
Copy constructor.
double yMaximum() const
Returns the y maximum value (top side of rectangle).
QgsRectangle & operator=(const QgsRectangle &r1)
Assignment operator.
void set(const QgsPointXY &p1, const QgsPointXY &p2, bool normalize=true)
Sets the rectangle from two QgsPoints.
void setYMaximum(double y)
Set the maximum y value.
QgsPointXY center() const
Returns the center point of the rectangle.
void setXMaximum(double x)
Set the maximum x value.
void grow(double delta)
Grows the rectangle in place by the specified amount.
bool operator==(const QgsRectangle &r1) const
Comparison operator.
~QgsRectangle()=default
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
double perimeter() const
Returns the perimeter of the rectangle.
void set(double xMin, double yMin, double xMax, double yMax, bool normalize=true)
Sets the rectangle from four points.
void normalize()
Normalize the rectangle so it has non-negative width/height.
bool isEmpty() const
Returns true if the rectangle has no area.
QgsRectangle(const QRectF &qRectF)
Construct a rectangle from a QRectF.
double height() const
Returns the height of the rectangle.
void setNull()
Mark a rectangle as being null (holding no spatial information).
bool contains(const QgsPointXY &p) const
Returns true when rectangle contains a point.
QgsRectangle buffered(double width) const
Gets rectangle enlarged by buffer.
void scale(double scaleFactor, double centerX, double centerY)
Scale the rectangle around its center point.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
void invert()
Swap x/y coordinates in the rectangle.
bool isFinite() const
Returns true if the rectangle has finite boundaries.
double distance(const QgsPointXY &point) const
Returns the distance from point to the nearest point on the boundary of the rectangle.
A class to represent a vector.
Definition qgsvector.h:30
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define str(x)
Definition qgis.cpp:38
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition qgis.h:4332
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define SIP_HOLDGIL
Definition qgis_sip.h:166
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
QgsInterval operator-(QDate date1, QDate date2)
Returns the interval between two dates.
QDateTime operator+(const QDateTime &start, const QgsInterval &interval)
Adds an interval to a datetime.
CORE_EXPORT QDataStream & operator<<(QDataStream &out, const QgsRectangle &rectangle)
Writes the list rectangle to stream out.
CORE_EXPORT QDataStream & operator>>(QDataStream &in, QgsRectangle &rectangle)
Reads a rectangle from stream in into rectangle.
int precision