QGIS API Documentation 3.41.0-Master (45a0abf3bec)
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 "qgsrectangle.h"
23
24#include <QVector3D>
25
26#include "qgspoint.h"
27
28class QgsVector3D;
29
42class CORE_EXPORT QgsBox3D
43{
44 Q_GADGET
45
46 public:
47
52#ifndef SIP_RUN
53 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(),
54 double xmax = std::numeric_limits<double>::quiet_NaN(), double ymax = std::numeric_limits<double>::quiet_NaN(), double zmax = std::numeric_limits<double>::quiet_NaN(),
55 bool normalize = true );
56
62 QgsBox3D( const QgsPoint &p1, const QgsPoint &p2, bool normalize = true );
63
70 QgsBox3D( const QgsVector3D &corner1, const QgsVector3D &corner2, bool normalize = true );
71
76 QgsBox3D( const QgsRectangle &rect,
77 double zMin = std::numeric_limits<double>::quiet_NaN(), double zMax = std::numeric_limits<double>::quiet_NaN(),
78 bool normalize = true );
79
80#else
81 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 )];
82 % MethodCode
83 if ( sipCanConvertToType( a0, sipType_QgsRectangle, SIP_NOT_NONE ) && a4 == Py_None && a5 == Py_None && a6 == Py_None )
84 {
85 int state;
86 sipIsErr = 0;
87
88 QgsRectangle *p = reinterpret_cast<QgsRectangle *>( sipConvertToType( a0, sipType_QgsRectangle, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
89 if ( sipIsErr )
90 {
91 sipReleaseType( p, sipType_QgsRectangle, state );
92 }
93 else
94 {
95 double z1 = a1 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a1 );
96 double z2 = a2 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a2 );
97 bool n = a3 == Py_None ? true : PyObject_IsTrue( a3 );
98
99 sipCpp = new QgsBox3D( *p, z1, z2, n );
100 }
101 }
102 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 )
103 {
104 int state;
105 sipIsErr = 0;
106
107 QgsPoint *pt1 = reinterpret_cast<QgsPoint *>( sipConvertToType( a0, sipType_QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
108 if ( sipIsErr )
109 {
110 sipReleaseType( pt1, sipType_QgsPoint, state );
111 }
112 else
113 {
114 QgsPoint *pt2 = reinterpret_cast<QgsPoint *>( sipConvertToType( a1, sipType_QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
115 if ( sipIsErr )
116 {
117 sipReleaseType( pt2, sipType_QgsPoint, state );
118 }
119 else
120 {
121 bool n = a2 == Py_None ? true : PyObject_IsTrue( a2 );
122 sipCpp = new QgsBox3D( *pt1, *pt2, n );
123 }
124 }
125 }
126 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 )
127 {
128 int state;
129 sipIsErr = 0;
130
131 QgsVector3D *corner1 = reinterpret_cast<QgsVector3D *>( sipConvertToType( a0, sipType_QgsVector3D, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
132 if ( sipIsErr )
133 {
134 sipReleaseType( corner1, sipType_QgsVector3D, state );
135 }
136 else
137 {
138 QgsVector3D *corner2 = reinterpret_cast<QgsVector3D *>( sipConvertToType( a1, sipType_QgsVector3D, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
139 if ( sipIsErr )
140 {
141 sipReleaseType( corner2, sipType_QgsVector3D, state );
142 }
143 else
144 {
145 bool n = a2 == Py_None ? true : PyObject_IsTrue( a2 );
146 sipCpp = new QgsBox3D( *corner1, *corner2, n );
147 }
148 }
149 }
150 else if (
151 ( a0 == Py_None || PyFloat_AsDouble( a0 ) != -1.0 || !PyErr_Occurred() ) &&
152 ( a1 == Py_None || PyFloat_AsDouble( a1 ) != -1.0 || !PyErr_Occurred() ) &&
153 ( a2 == Py_None || PyFloat_AsDouble( a2 ) != -1.0 || !PyErr_Occurred() ) &&
154 ( a3 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) &&
155 ( a4 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) &&
156 ( a5 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) &&
157 ( a6 == Py_None || PyFloat_AsDouble( a3 ) != -1.0 || !PyErr_Occurred() ) )
158 {
159 double x1 = a0 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a0 );
160 double y1 = a1 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a1 );
161 double z1 = a2 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a2 );
162 double x2 = a3 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a3 );
163 double y2 = a4 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a4 );
164 double z2 = a5 == Py_None ? std::numeric_limits<double>::quiet_NaN() : PyFloat_AsDouble( a5 );
165 bool n = a6 == Py_None ? true : PyObject_IsTrue( a6 );
166 sipCpp = new QgsBox3D( x1, y1, z1, x2, y2, z2, n );
167 }
168 else // Invalid ctor arguments
169 {
170 PyErr_SetString( PyExc_TypeError, QStringLiteral( "Invalid type in constructor arguments." ).toUtf8().constData() );
171 sipIsErr = 1;
172 }
173 % End
174#endif
175
181 void set( double xMin, double yMin, double zMin, double xMax, double yMax, double zMax, bool normalize = true )
182 {
183 mBounds2d.set( xMin, yMin, xMax, yMax, false );
184 mZmin = zMin;
185 mZmax = zMax;
186 if ( normalize )
187 {
189 }
190 }
191
197 void setXMinimum( double x ) SIP_HOLDGIL;
198
204 void setXMaximum( double x ) SIP_HOLDGIL;
205
211 double xMinimum() const SIP_HOLDGIL { return mBounds2d.xMinimum(); }
212
218 double xMaximum() const SIP_HOLDGIL { return mBounds2d.xMaximum(); }
219
225 void setYMinimum( double y ) SIP_HOLDGIL;
226
232 void setYMaximum( double y ) SIP_HOLDGIL;
233
239 double yMinimum() const SIP_HOLDGIL { return mBounds2d.yMinimum(); }
240
246 double yMaximum() const SIP_HOLDGIL { return mBounds2d.yMaximum(); }
247
253 void setZMinimum( double z ) SIP_HOLDGIL;
254
260 void setZMaximum( double z ) SIP_HOLDGIL;
261
267 double zMinimum() const SIP_HOLDGIL { return mZmin; }
268
274 double zMaximum() const SIP_HOLDGIL { return mZmax; }
275
281 void setNull() SIP_HOLDGIL;
282
286 void normalize() SIP_HOLDGIL;
287
293 double width() const SIP_HOLDGIL { return mBounds2d.width(); }
294
300 double height() const SIP_HOLDGIL { return mBounds2d.height(); }
301
307 double depth() const SIP_HOLDGIL { return mZmax - mZmin; }
308
314 QgsVector3D center() const SIP_HOLDGIL;
315
321 double area() const SIP_HOLDGIL { return mBounds2d.area(); }
322
326 double volume() const SIP_HOLDGIL { return mBounds2d.area() * ( mZmax - mZmin ); }
327
331 QgsBox3D intersect( const QgsBox3D &other ) const SIP_HOLDGIL;
332
337 bool is2d() const SIP_HOLDGIL;
338
346 bool is3D() const SIP_HOLDGIL;
347
351 bool intersects( const QgsBox3D &other ) const SIP_HOLDGIL;
352
356 bool contains( const QgsBox3D &other ) const SIP_HOLDGIL;
357
364 bool contains( const QgsPoint &point ) const SIP_HOLDGIL;
365
375 bool contains( double x, double y, double z ) const SIP_HOLDGIL;
376
382 void combineWith( const QgsBox3D &box ) SIP_HOLDGIL;
383
389 void combineWith( double x, double y, double z ) SIP_HOLDGIL;
390
394 QgsRectangle toRectangle() const SIP_HOLDGIL { return mBounds2d; }
395
402 double distanceTo( const QVector3D &point ) const SIP_HOLDGIL;
403
404 bool operator==( const QgsBox3D &other ) const SIP_HOLDGIL;
405
413 void scale( double scaleFactor, const QgsPoint &center = QgsPoint() ) SIP_HOLDGIL;
414
420 void scale( double scaleFactor, double centerX, double centerY, double centerZ ) SIP_HOLDGIL;
421
426 void grow( double delta );
427
437 bool isNull() const SIP_HOLDGIL;
438
447 bool isEmpty() const SIP_HOLDGIL;
448
456 QString toString( int precision = 16 ) const SIP_HOLDGIL;
457
461 QVector< QgsVector3D > corners() const SIP_HOLDGIL;
462
467 QgsBox3D operator-( const QgsVector3D &v ) const SIP_HOLDGIL;
468
473 QgsBox3D operator+( const QgsVector3D &v ) const SIP_HOLDGIL;
474
479 QgsBox3D &operator-=( const QgsVector3D &v ) SIP_HOLDGIL;
480
485 QgsBox3D &operator+=( const QgsVector3D &v ) SIP_HOLDGIL;
486
487
488#ifdef SIP_RUN
489 SIP_PYOBJECT __repr__();
490 % MethodCode
491 QString str = QStringLiteral( "<QgsBox3D(%1, %2, %3, %4, %5, %6)>" )
492 .arg( sipCpp->xMinimum() )
493 .arg( sipCpp->yMinimum() )
494 .arg( sipCpp->zMinimum() )
495 .arg( sipCpp->xMaximum() )
496 .arg( sipCpp->yMaximum() )
497 .arg( sipCpp->zMaximum() );
498 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
499 % End
500#endif
501
502 private:
503
504 QgsRectangle mBounds2d;
505 double mZmin = std::numeric_limits<double>::quiet_NaN();
506 double mZmax = std::numeric_limits<double>::quiet_NaN();
507
508};
509
510#endif // QGSBOX3D_H
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:43
double yMaximum() const
Returns the maximum y value.
Definition qgsbox3d.h:246
double depth() const
Returns the depth of the box.
Definition qgsbox3d.h:307
double xMinimum() const
Returns the minimum x value.
Definition qgsbox3d.h:211
double zMaximum() const
Returns the maximum z value.
Definition qgsbox3d.h:274
double xMaximum() const
Returns the maximum x value.
Definition qgsbox3d.h:218
double volume() const
Returns the volume of the box.
Definition qgsbox3d.h:326
void normalize()
Normalize the box so it has non-negative width/height/depth.
Definition qgsbox3d.cpp:109
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:181
double zMinimum() const
Returns the minimum z value.
Definition qgsbox3d.h:267
double yMinimum() const
Returns the minimum y value.
Definition qgsbox3d.h:239
double height() const
Returns the height of the box.
Definition qgsbox3d.h:300
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
A rectangle specified with double values.
Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double precisi...
Definition qgsvector3d.h:31
#define str(x)
Definition qgis.cpp:39
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:232
#define SIP_HOLDGIL
Definition qgis_sip.h:171
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
int precision