34 mCenter[0] =
center.at( 0 );
35 mCenter[1] =
center.at( 1 );
36 mCenter[2] =
center.at( 2 );
40 for (
int i = 0; i < 9; ++i )
54 for (
int i = 0; i < 3; ++i )
56 mHalfAxes[
static_cast< int >( i * 3 )] =
halfAxes.at( i ).x();
57 mHalfAxes[
static_cast< int >( i * 3 + 1 )] =
halfAxes.at( i ).y();
58 mHalfAxes[
static_cast< int >( i * 3 + 2 )] =
halfAxes.at( i ).z();
72 mHalfAxes[0] = v1.
x();
73 mHalfAxes[1] = v1.
y();
74 mHalfAxes[2] = v1.
z();
75 mHalfAxes[3] = v2.
x();
76 mHalfAxes[4] = v2.
y();
77 mHalfAxes[5] = v2.
z();
78 mHalfAxes[6] = v3.
x();
79 mHalfAxes[7] = v3.
y();
80 mHalfAxes[8] = v3.
z();
87 QgsVector3D( box.width() * 0.5, 0, 0 ),
88 QgsVector3D( 0, box.height() * 0.5, 0 ),
89 QgsVector3D( 0, 0, box.depth() * 0.5 )
95 return std::isnan( mCenter[0] ) || std::isnan( mCenter[1] ) || std::isnan( mCenter[2] );
102 for (
int i = 0; i < 9; ++i )
104 res.append( mHalfAxes[i] );
113 std::fabs( mHalfAxes[0] ) + std::fabs( mHalfAxes[3] ) + std::fabs( mHalfAxes[6] ),
114 std::fabs( mHalfAxes[1] ) + std::fabs( mHalfAxes[4] ) + std::fabs( mHalfAxes[7] ),
115 std::fabs( mHalfAxes[2] ) + std::fabs( mHalfAxes[5] ) + std::fabs( mHalfAxes[8] ),
118 const double minX = mCenter[0] -
extent[0];
119 const double maxX = mCenter[0] +
extent[0];
120 const double minY = mCenter[1] -
extent[1];
121 const double maxY = mCenter[1] +
extent[1];
122 const double minZ = mCenter[2] -
extent[2];
123 const double maxZ = mCenter[2] +
extent[2];
125 return QgsBox3D( minX, minY, minZ, maxX, maxY, maxZ );
131 const QgsVector3D a1( mHalfAxes[0], mHalfAxes[1], mHalfAxes[2] ), a0( -mHalfAxes[0], -mHalfAxes[1], -mHalfAxes[2] );
132 const QgsVector3D b1( mHalfAxes[3], mHalfAxes[4], mHalfAxes[5] ), b0( -mHalfAxes[3], -mHalfAxes[4], -mHalfAxes[5] );
133 const QgsVector3D c1( mHalfAxes[6], mHalfAxes[7], mHalfAxes[8] ), c0( -mHalfAxes[6], -mHalfAxes[7], -mHalfAxes[8] );
135 QVector<QgsVector3D> cor( 8 );
137 for (
int i = 0; i < 8; ++i, ++corData )
140 const QgsVector3D bb = ( ( i / 2 ) % 2 == 0 ? b1 : b0 );
150 QgsVector3D axis1( mHalfAxes[0], mHalfAxes[1], mHalfAxes[2] );
151 QgsVector3D axis2( mHalfAxes[3], mHalfAxes[4], mHalfAxes[5] );
152 QgsVector3D axis3( mHalfAxes[6], mHalfAxes[7], mHalfAxes[8] );
158 QgsVector3D axis1( mHalfAxes[0], mHalfAxes[1], mHalfAxes[2] );
159 QgsVector3D axis2( mHalfAxes[3], mHalfAxes[4], mHalfAxes[5] );
160 QgsVector3D axis3( mHalfAxes[6], mHalfAxes[7], mHalfAxes[8] );
168 Q_ASSERT(
c.count() == 8 );
169 for (
int i = 0; i < 8; ++i )
178 if ( v.x() < v0.
x() ) v0.
setX( v.x() );
179 if ( v.y() < v0.
y() ) v0.
setY( v.y() );
180 if ( v.z() < v0.
z() ) v0.
setZ( v.z() );
181 if ( v.x() > v1.x() ) v1.setX( v.x() );
182 if ( v.y() > v1.y() ) v1.setY( v.y() );
183 if ( v.z() > v1.z() ) v1.setZ( v.z() );
185 return QgsBox3D( v0.
x(), v0.
y(), v0.
z(), v1.x(), v1.y(), v1.z() );
190 const double *ptr = transform.
constData();
192 ptr[1], ptr[5], ptr[9], 0,
193 ptr[2], ptr[6], ptr[10], 0,
203 QList<double>() << col1.
x() << col1.
y() << col1.
z()
204 << col2.
x() << col2.
y() << col2.
z()
205 << col3.
x() << col3.
y() << col3.
z() );
216 { mHalfAxes[0], mHalfAxes[1], mHalfAxes[2] },
217 { mHalfAxes[3], mHalfAxes[4], mHalfAxes[5] },
218 { mHalfAxes[6], mHalfAxes[7], mHalfAxes[8] }
223 { other.mHalfAxes[0], other.mHalfAxes[1], other.mHalfAxes[2] },
224 { other.mHalfAxes[3], other.mHalfAxes[4], other.mHalfAxes[5] },
225 { other.mHalfAxes[6], other.mHalfAxes[7], other.mHalfAxes[8] }
228 for (
int a = 0; a < 3; ++a )
231 for (
int b = 0; b < 3; ++b )
243 const double penetration = ( ra + rb ) - tl;
244 if ( penetration <= 0 )
249 for (
int a = 0; a < 3; ++a )
257 const double penetration = ( ra + rb ) - tl;
258 if ( penetration <= 0 )
262 for (
int b = 0; b < 3; ++b )
270 const double penetration = ( ra + rb ) - tl;
271 if ( penetration <= 0 )
A 3-dimensional box composed of x, y, z coordinates.
QgsVector3D center() const
Returns the center of the box as a vector.
A simple 4x4 matrix implementation useful for transformation in 3D space.
QgsVector3D map(const QgsVector3D &vector) const
Matrix-vector multiplication (vector is converted to homogeneous coordinates [X,Y,...
const double * constData() const
Returns pointer to the matrix data (stored in column-major order).
const double * halfAxes() const
Returns the half axes matrix;.
QgsBox3D extent() const
Returns the overall bounding box of the object.
double longestSide() const
Returns size of the longest side of the box.
bool isNull() const
Returns true if the box is a null box.
QgsOrientedBox3D()
Constructor for a null oriented box.
bool intersects(const QgsOrientedBox3D &other) const
Returns true if the box intersects the other box.
QVector< QgsVector3D > corners() const
Returns an array of all corners as 3D vectors.
static QgsOrientedBox3D fromBox3D(const QgsBox3D &box)
Constructs an oriented box from an axis-aligned bounding box.
QList< double > halfAxesList() const
Returns the half axes matrix;.
QgsBox3D reprojectedExtent(const QgsCoordinateTransform &ct) const
Reprojects corners of this box using the given coordinate transform and returns axis-aligned box cont...
QgsVector3D center() const
Returns the vector to the center of the box.
QgsVector3D size() const
Returns size of sides of the box.
QgsOrientedBox3D transformed(const QgsMatrix4x4 &transform) const
Returns box transformed by a 4x4 matrix.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
double y() const
Returns Y coordinate.
double z() const
Returns Z coordinate.
void setZ(double z)
Sets Z coordinate.
bool isNull() const
Returns true if all three coordinates are zero.
static double dotProduct(const QgsVector3D &v1, const QgsVector3D &v2)
Returns the dot product of two vectors.
double x() const
Returns X coordinate.
void setX(double x)
Sets X coordinate.
void normalize()
Normalizes the current vector in place.
static QgsVector3D crossProduct(const QgsVector3D &v1, const QgsVector3D &v2)
Returns the cross product of two vectors.
void setY(double y)
Sets Y coordinate.
double length() const
Returns the length of the vector.
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