31 mCenter[0] =
center.at( 0 );
32 mCenter[1] =
center.at( 1 );
33 mCenter[2] =
center.at( 2 );
37 for (
int i = 0; i < 9; ++i )
51 for (
int i = 0; i < 3; ++i )
53 mHalfAxes[
static_cast< int >( i * 3 )] =
halfAxes.at( i ).x();
54 mHalfAxes[
static_cast< int >( i * 3 + 1 )] =
halfAxes.at( i ).y();
55 mHalfAxes[
static_cast< int >( i * 3 + 2 )] =
halfAxes.at( i ).z();
64 QgsVector3D( box.width() * 0.5, 0, 0 ),
65 QgsVector3D( 0, box.height() * 0.5, 0 ),
66 QgsVector3D( 0, 0, box.depth() * 0.5 )
72 return std::isnan( mCenter[0] ) || std::isnan( mCenter[1] ) || std::isnan( mCenter[2] );
79 for (
int i = 0; i < 9; ++i )
81 res.append( mHalfAxes[i] );
90 std::fabs( mHalfAxes[0] ) + std::fabs( mHalfAxes[3] ) + std::fabs( mHalfAxes[6] ),
91 std::fabs( mHalfAxes[1] ) + std::fabs( mHalfAxes[4] ) + std::fabs( mHalfAxes[7] ),
92 std::fabs( mHalfAxes[2] ) + std::fabs( mHalfAxes[5] ) + std::fabs( mHalfAxes[8] ),
95 const double minX = mCenter[0] -
extent[0];
96 const double maxX = mCenter[0] +
extent[0];
97 const double minY = mCenter[1] -
extent[1];
98 const double maxY = mCenter[1] +
extent[1];
99 const double minZ = mCenter[2] -
extent[2];
100 const double maxZ = mCenter[2] +
extent[2];
102 return QgsBox3D( minX, minY, minZ, maxX, maxY, maxZ );
108 const QgsVector3D a1( mHalfAxes[0], mHalfAxes[1], mHalfAxes[2] ), a0( -mHalfAxes[0], -mHalfAxes[1], -mHalfAxes[2] );
109 const QgsVector3D b1( mHalfAxes[3], mHalfAxes[4], mHalfAxes[5] ), b0( -mHalfAxes[3], -mHalfAxes[4], -mHalfAxes[5] );
110 const QgsVector3D c1( mHalfAxes[6], mHalfAxes[7], mHalfAxes[8] ), c0( -mHalfAxes[6], -mHalfAxes[7], -mHalfAxes[8] );
112 QVector<QgsVector3D> cor( 8 );
114 for (
int i = 0; i < 8; ++i, ++corData )
117 const QgsVector3D bb = ( ( i / 2 ) % 2 == 0 ? b1 : b0 );
127 QgsVector3D axis1( mHalfAxes[0], mHalfAxes[1], mHalfAxes[2] );
128 QgsVector3D axis2( mHalfAxes[3], mHalfAxes[4], mHalfAxes[5] );
129 QgsVector3D axis3( mHalfAxes[6], mHalfAxes[7], mHalfAxes[8] );
137 Q_ASSERT(
c.count() == 8 );
138 for (
int i = 0; i < 8; ++i )
147 if ( v.x() < v0.
x() ) v0.
setX( v.x() );
148 if ( v.y() < v0.
y() ) v0.
setY( v.y() );
149 if ( v.z() < v0.
z() ) v0.
setZ( v.z() );
150 if ( v.x() > v1.x() ) v1.setX( v.x() );
151 if ( v.y() > v1.y() ) v1.setY( v.y() );
152 if ( v.z() > v1.z() ) v1.setZ( v.z() );
154 return QgsBox3D( v0.
x(), v0.
y(), v0.
z(), v1.x(), v1.y(), v1.z() );
159 const double *ptr = transform.
constData();
161 ptr[1], ptr[5], ptr[9], 0,
162 ptr[2], ptr[6], ptr[10], 0,
172 QList<double>() << col1.
x() << col1.
y() << col1.
z()
173 << col2.
x() << col2.
y() << col2.
z()
174 << col3.
x() << col3.
y() << col3.
z() );
185 { mHalfAxes[0], mHalfAxes[1], mHalfAxes[2] },
186 { mHalfAxes[3], mHalfAxes[4], mHalfAxes[5] },
187 { mHalfAxes[6], mHalfAxes[7], mHalfAxes[8] }
192 { other.mHalfAxes[0], other.mHalfAxes[1], other.mHalfAxes[2] },
193 { other.mHalfAxes[3], other.mHalfAxes[4], other.mHalfAxes[5] },
194 { other.mHalfAxes[6], other.mHalfAxes[7], other.mHalfAxes[8] }
197 for (
int a = 0; a < 3; ++a )
200 for (
int b = 0; b < 3; ++b )
212 const double penetration = ( ra + rb ) - tl;
213 if ( penetration <= 0 )
218 for (
int a = 0; a < 3; ++a )
226 const double penetration = ( ra + rb ) - tl;
227 if ( penetration <= 0 )
231 for (
int b = 0; b < 3; ++b )
239 const double penetration = ( ra + rb ) - tl;
240 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)
Represents a oriented (rotated) box in 3 dimensions.
const double * halfAxes() const
Returns the half axes matrix;.
QgsBox3D extent() const
Returns the overall bounding box of the object.
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.
Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double precisi...
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