QGIS API Documentation 4.1.0-Master (60fea48833c)
Loading...
Searching...
No Matches
qgsbox3d.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsbox3d.h
3 ----------
4 begin : April 2017
5 copyright : (C) 2017 by Nyall Dawson
6 email : nyall dot dawson at gmail dot 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 QGSBOX3D_H
19#define QGSBOX3D_H
20
21#include "qgis_core.h"
22#include "qgspoint.h"
23#include "qgsrectangle.h"
24
25#include <QString>
26#include <QVector3D>
27
28using namespace Qt::StringLiterals;
29
30class QgsVector3D;
31
44class CORE_EXPORT QgsBox3D
45{
46 Q_GADGET
47
48 public:
53#ifndef SIP_RUN
55 double xmin = std::numeric_limits<double>::quiet_NaN(),
56 double ymin = std::numeric_limits<double>::quiet_NaN(),
57 double zmin = std::numeric_limits<double>::quiet_NaN(),
58 double xmax = std::numeric_limits<double>::quiet_NaN(),
59 double ymax = std::numeric_limits<double>::quiet_NaN(),
60 double zmax = std::numeric_limits<double>::quiet_NaN(),
61 bool normalize = true
62 );
63
69 QgsBox3D( const QgsPoint &p1, const QgsPoint &p2, bool normalize = true );
70
77 QgsBox3D( const QgsVector3D &corner1, const QgsVector3D &corner2, bool normalize = true );
78
83 explicit QgsBox3D( const QgsRectangle &rect, double zMin = std::numeric_limits<double>::quiet_NaN(), double zMax = std::numeric_limits<double>::quiet_NaN(), bool normalize = true );
84
85#else
86 // clang-format off
87 QgsBox3D( SIP_PYOBJECT x SIP_TYPEHINT( Optional[Union[QgsPoint, QgsVector3D, QgsRectangle, float]] ) = Py_None, SIP_PYOBJECT y SIP_TYPEHINT( Optional[QgsPoint, QgsVector3D, float] ) = Py_None, SIP_PYOBJECT z SIP_TYPEHINT( Optional[Union[bool, float]] ) = Py_None, SIP_PYOBJECT x2 SIP_TYPEHINT( Optional[Union[bool, float]] ) = Py_None, SIP_PYOBJECT y2 SIP_TYPEHINT( Optional[float] ) = Py_None, SIP_PYOBJECT z2 SIP_TYPEHINT( Optional[float] ) = Py_None, SIP_PYOBJECT n SIP_TYPEHINT( Optional[bool] ) = Py_None ) [( double x = 0.0, double y = 0.0, double z = 0.0, double x2 = 0.0, double y2 = 0.0, double z2 = 0.0, bool n = true )];
88 % MethodCode
89 if ( sipCanConvertToType( a0, sipType_QgsRectangle, SIP_NOT_NONE ) && a4 == Py_None && a5 == Py_None && a6 == Py_None )
90 {
91 int state;
92 sipIsErr = 0;
93
94 QgsRectangle *p = reinterpret_cast<QgsRectangle *>( sipConvertToType( a0, sipType_QgsRectangle, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
95 if ( !sipIsErr )
96 {
97 double z1 = a1 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a1 );
98 double z2 = a2 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a2 );
99 bool n = a3 == Py_None ? true : PyObject_IsTrue( a3 );
100
101 sipCpp = new QgsBox3D( *p, z1, z2, n );
102 }
103 sipReleaseType( p, sipType_QgsRectangle, state );
104 }
105 else if ( sipCanConvertToType( a0, sipType_QgsPoint, SIP_NOT_NONE ) && sipCanConvertToType( a1, sipType_QgsPoint, SIP_NOT_NONE ) && a3 == Py_None && a4 == Py_None && a5 == Py_None && a6 == Py_None )
106 {
107 int state;
108 sipIsErr = 0;
109
110 QgsPoint *pt1 = reinterpret_cast<QgsPoint *>( sipConvertToType( a0, sipType_QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
111 if ( !sipIsErr )
112 {
113 QgsPoint *pt2 = reinterpret_cast<QgsPoint *>( sipConvertToType( a1, sipType_QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
114 if ( !sipIsErr )
115 {
116 bool n = a2 == Py_None ? true : PyObject_IsTrue( a2 );
117 sipCpp = new QgsBox3D( *pt1, *pt2, n );
118 }
119 sipReleaseType( pt2, sipType_QgsPoint, state );
120 }
121 sipReleaseType( pt1, sipType_QgsPoint, state );
122 }
123 else if ( sipCanConvertToType( a0, sipType_QgsVector3D, SIP_NOT_NONE ) && sipCanConvertToType( a1, sipType_QgsVector3D, SIP_NOT_NONE ) && a3 == Py_None && a4 == Py_None && a5 == Py_None && a6 == Py_None )
124 {
125 int state;
126 sipIsErr = 0;
127
128 QgsVector3D *corner1 = reinterpret_cast<QgsVector3D *>( sipConvertToType( a0, sipType_QgsVector3D, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
129 if ( !sipIsErr )
130 {
131 QgsVector3D *corner2 = reinterpret_cast<QgsVector3D *>( sipConvertToType( a1, sipType_QgsVector3D, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
132 if ( !sipIsErr )
133 {
134 bool n = a2 == Py_None ? true : PyObject_IsTrue( a2 );
135 sipCpp = new QgsBox3D( *corner1, *corner2, n );
136 }
137 sipReleaseType( corner2, sipType_QgsVector3D, state );
138 }
139 sipReleaseType( corner1, sipType_QgsVector3D, state );
140 }
141 else if (
142 ( a0 == Py_None || PyFloat_AsDouble( a0 ) != -1.0 || !PyErr_Occurred() ) &&
143 ( a1 == Py_None || PyFloat_AsDouble( a1 ) != -1.0 || !PyErr_Occurred() ) &&
144 ( a2 == Py_None || PyFloat_AsDouble( a2 ) != -1.0 || !PyErr_Occurred() ) &&
145 ( a3 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) &&
146 ( a4 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) &&
147 ( a5 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) &&
148 ( a6 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) )
149 {
150 double x1 = a0 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a0 );
151 double y1 = a1 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a1 );
152 double z1 = a2 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a2 );
153 double x2 = a3 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a3 );
154 double y2 = a4 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a4 );
155 double z2 = a5 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a5 );
156 bool n = a6 == Py_None ? true : PyObject_IsTrue( a6 );
157 sipCpp = new QgsBox3D( x1, y1, z1, x2, y2, z2, n );
158 }
159 else // Invalid ctor arguments
160 {
161 PyErr_SetString( PyExc_TypeError, u"Invalid type in constructor arguments."_s.toUtf8().constData() );
162 sipIsErr = 1;
163 }
164 % End
165// clang-format on
166#endif
167
173 void set( double xMin, double yMin, double zMin, double xMax, double yMax, double zMax, bool normalize = true )
174 {
175 mBounds2d.set( xMin, yMin, xMax, yMax, false );
176 mZmin = zMin;
177 mZmax = zMax;
178 if ( normalize )
179 {
181 }
182 }
183
184 // clang-format off
190 void setXMinimum( double x ) SIP_HOLDGIL;
191 // clang-format on
192
198 void setXMaximum( double x ) SIP_HOLDGIL;
199
205 double xMinimum() const SIP_HOLDGIL { return mBounds2d.xMinimum(); }
206
212 double xMaximum() const SIP_HOLDGIL { return mBounds2d.xMaximum(); }
213
219 void setYMinimum( double y ) SIP_HOLDGIL;
220
226 void setYMaximum( double y ) SIP_HOLDGIL;
227
233 double yMinimum() const SIP_HOLDGIL { return mBounds2d.yMinimum(); }
234
240 double yMaximum() const SIP_HOLDGIL { return mBounds2d.yMaximum(); }
241
247 void setZMinimum( double z ) SIP_HOLDGIL;
248
254 void setZMaximum( double z ) SIP_HOLDGIL;
255
261 double zMinimum() const SIP_HOLDGIL { return mZmin; }
262
268 double zMaximum() const SIP_HOLDGIL { return mZmax; }
269
275 void setNull() SIP_HOLDGIL;
276
280 void normalize() SIP_HOLDGIL;
281
287 double width() const SIP_HOLDGIL { return mBounds2d.width(); }
288
294 double height() const SIP_HOLDGIL { return mBounds2d.height(); }
295
301 double depth() const SIP_HOLDGIL { return mZmax - mZmin; }
302
308 QgsVector3D center() const SIP_HOLDGIL;
309
315 double area() const SIP_HOLDGIL { return mBounds2d.area(); }
316
320 double volume() const SIP_HOLDGIL { return mBounds2d.area() * ( mZmax - mZmin ); }
321
325 QgsBox3D intersect( const QgsBox3D &other ) const SIP_HOLDGIL;
326
331 bool is2d() const SIP_HOLDGIL;
332
340 bool is3D() const SIP_HOLDGIL;
341
345 bool intersects( const QgsBox3D &other ) const SIP_HOLDGIL;
346
350 bool contains( const QgsBox3D &other ) const SIP_HOLDGIL;
351
358 bool contains( const QgsPoint &point ) const SIP_HOLDGIL;
359
369 bool contains( double x, double y, double z ) const SIP_HOLDGIL;
370
376 void combineWith( const QgsBox3D &box ) SIP_HOLDGIL;
377
383 void combineWith( double x, double y, double z ) SIP_HOLDGIL;
384
388 QgsRectangle toRectangle() const SIP_HOLDGIL { return mBounds2d; }
389
397 Q_DECL_DEPRECATED double distanceTo( const QVector3D &point ) const SIP_DEPRECATED { return distanceTo( QgsVector3D( point ) ); }
398
405 double distanceTo( const QgsVector3D &point ) const SIP_HOLDGIL;
406
407 bool operator==( const QgsBox3D &other ) const SIP_HOLDGIL;
408
416 void scale( double scaleFactor, const QgsPoint &center = QgsPoint() ) SIP_HOLDGIL;
417
423 void scale( double scaleFactor, double centerX, double centerY, double centerZ ) SIP_HOLDGIL;
424
429 void grow( double delta );
430
440 bool isNull() const SIP_HOLDGIL;
441
450 bool isEmpty() const SIP_HOLDGIL;
451
459 QString toString( int precision = 16 ) const SIP_HOLDGIL;
460
464 QVector< QgsVector3D > corners() const SIP_HOLDGIL;
465
470 QgsBox3D operator-( const QgsVector3D &v ) const SIP_HOLDGIL;
471
476 QgsBox3D operator+( const QgsVector3D &v ) const SIP_HOLDGIL;
477
482 QgsBox3D &operator-=( const QgsVector3D &v ) SIP_HOLDGIL;
483
488 QgsBox3D &operator+=( const QgsVector3D &v ) SIP_HOLDGIL;
489
490
491#ifdef SIP_RUN
492// clang-format off
493 SIP_PYOBJECT __repr__();
494 % MethodCode
495 QString str = u"<QgsBox3D(%1, %2, %3, %4, %5, %6)>"_s
496 .arg( sipCpp->xMinimum() )
497 .arg( sipCpp->yMinimum() )
498 .arg( sipCpp->zMinimum() )
499 .arg( sipCpp->xMaximum() )
500 .arg( sipCpp->yMaximum() )
501 .arg( sipCpp->zMaximum() );
502 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
503 % End
504// clang-format on
505#endif
506
507 private:
508
509 QgsRectangle mBounds2d;
510 double mZmin = std::numeric_limits<double>::quiet_NaN();
511 double mZmax = std::numeric_limits<double>::quiet_NaN();
512
513};
514
515#endif // QGSBOX3D_H
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:45
double yMaximum() const
Returns the maximum y value.
Definition qgsbox3d.h:240
double depth() const
Returns the depth of the box.
Definition qgsbox3d.h:301
double xMinimum() const
Returns the minimum x value.
Definition qgsbox3d.h:205
double zMaximum() const
Returns the maximum z value.
Definition qgsbox3d.h:268
double xMaximum() const
Returns the maximum x value.
Definition qgsbox3d.h:212
double volume() const
Returns the volume of the box.
Definition qgsbox3d.h:320
void normalize()
Normalize the box so it has non-negative width/height/depth.
Definition qgsbox3d.cpp:115
QgsRectangle toRectangle() const
Converts the box to a 2D rectangle.
Definition qgsbox3d.h:388
Q_DECL_DEPRECATED double distanceTo(const QVector3D &point) const
Returns the smallest distance between the box and the point point (returns 0 if the point is inside t...
Definition qgsbox3d.h:397
double area() const
Returns the area of the box.
Definition qgsbox3d.h:315
void set(double xMin, double yMin, double zMin, double xMax, double yMax, double zMax, bool normalize=true)
Sets the box from a set of (x,y,z) minimum and maximum coordinates.
Definition qgsbox3d.h:173
QgsBox3D(double xmin=std::numeric_limits< double >::quiet_NaN(), double ymin=std::numeric_limits< double >::quiet_NaN(), double zmin=std::numeric_limits< double >::quiet_NaN(), double xmax=std::numeric_limits< double >::quiet_NaN(), double ymax=std::numeric_limits< double >::quiet_NaN(), double zmax=std::numeric_limits< double >::quiet_NaN(), bool normalize=true)
Constructor for QgsBox3D which accepts the ranges of x/y/z coordinates.
Definition qgsbox3d.cpp:30
double width() const
Returns the width of the box.
Definition qgsbox3d.h:287
double zMinimum() const
Returns the minimum z value.
Definition qgsbox3d.h:261
double yMinimum() const
Returns the minimum y value.
Definition qgsbox3d.h:233
double height() const
Returns the height of the box.
Definition qgsbox3d.h:294
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:53
A rectangle specified with double values.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
Definition qgsvector3d.h:33
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:239
#define SIP_DEPRECATED
Definition qgis_sip.h:113
#define SIP_HOLDGIL
Definition qgis_sip.h:178
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)