Workspace 6.21.5
Public Member Functions | List of all members
BoundingCylinder Class Reference

Describes a bounding cylinder region in 3D space. More...

#include <Mesh/Geometry/boundingcylinder.h>

Inheritance diagram for BoundingCylinder:
[legend]

Public Member Functions

 BoundingCylinder ()
 
 BoundingCylinder (const BoundingCylinder &cylinder)
 
 BoundingCylinder (const Vector3d &centerA, const Vector3d &centerB, double radius)
 
double calculateLength () const
 
BoundingCylinderclone () const override
 
BoundingCylindercloneRegion () const override
 
bool contains (const Vector3d &p) const override
 
void destroy () override
 
bool getBoundingBox (Vector3d &minimum, Vector3d &maximum) const override
 
bool getBoundingSphere (Vector3d &center, double &radius) const override
 
Vector3d getCenterA () const
 
Vector3d getCenterB () const
 
double getRadius () const
 
bool isNull () const override
 
bool operator!= (const BoundingCylinder &v) const
 
bool operator== (const BoundingCylinder &b) const
 
void setCenterA (const Vector3d &c)
 
void setCenterB (const Vector3d &c)
 
void setRadius (double r)
 
bool visit (RegionProcessor &processor) override
 
- Public Member Functions inherited from Region
virtual ~Region ()=default
 
virtual RegioncloneRegion () const =0
 
virtual bool contains (const Vector3d &p) const =0
 
virtual void destroy ()=0
 
virtual bool getBoundingBox (Vector3d &minimum, Vector3d &maximum) const =0
 
virtual bool getBoundingSphere (Vector3d &center, double &radius) const
 
virtual bool isNull () const =0
 
virtual bool visit (RegionProcessor &processor)=0
 
- Public Member Functions inherited from ObjectGroup
 ~ObjectGroup () override
 
bool add (const QString &name, DataObject &obj)
 
bool canSerialize () const override
 
ObjectGroupclone () const override=0
 
bool empty () const
 
void ensureGroupHasData ()
 
void erase (int index)
 
DataObjectgetChild (const QString &name)
 
const DataObjectgetChild (const QString &name) const
 
DataObjectgetDataObject (int index)
 
const DataObjectgetDataObject (int index) const
 
int getIndex (const QString &name) const
 
const QString & getName (int index) const
 
virtual QString getPreferedWidget (const QString &name) const
 
bool hasData () const
 
bool haveName (const QString &name) const
 
bool insert (const QString &name, DataObject &obj, int index=-1)
 
bool load (const QJsonDocument &doc)
 
bool load (const SerializedItem &item) override
 
bool save (QJsonDocument &doc) const
 
bool save (SerializedItem &item) const override
 
unsigned size () const
 
- Public Member Functions inherited from Clonable
virtual ~Clonable ()=default
 
virtual Clonableclone () const =0
 
- Public Member Functions inherited from Serialize
virtual ~Serialize ()=default
 
virtual bool canSerialize () const =0
 
virtual bool load (const SerializedItem &item)=0
 
virtual bool save (SerializedItem &item) const =0
 

Additional Inherited Members

- Protected Member Functions inherited from ObjectGroup
 ObjectGroup ()
 
void clear ()
 
ObjectGroupoperator= (const ObjectGroup &rhs)
 
bool operator== (const ObjectGroup &rhs) const
 
void swap (ObjectGroup &rhs)
 

Detailed Description

The cylinder is defined by the two circular face centers and a constant radius.

Constructor & Destructor Documentation

◆ BoundingCylinder() [1/3]

Constructs a null bounding cylinder.

◆ BoundingCylinder() [2/3]

BoundingCylinder ( const BoundingCylinder cylinder)
Parameters
cylinderThe bounding cylinder to copy.

◆ BoundingCylinder() [3/3]

BoundingCylinder ( const Vector3d centerA,
const Vector3d centerB,
double  radius 
)
Parameters
centerAThe center of the bounding cylinder at one end.
centerBThe center of the bounding cylinder at the other end.
radiusThe radius of the bounding cylinder. It must not be negative.

Member Function Documentation

◆ calculateLength()

double calculateLength ( ) const
Returns
The length of the cylinder.

This is just a convenience function. It is entirely equivalent to taking the magnitude of the difference between the two face centers.

Precondition
isNull() must return false.

◆ clone()

BoundingCylinder * clone ( ) const
overridevirtual
Returns
A clone of this object.
Note
Subclasses would normally return their own type rather than the Clonable type. The C++ language rules allow a more derived type to be returned from a virtual function and the compiler will still treat it as a valid override.

We redeclare this function only so that the more derived return type is available without casting.

Implements ObjectGroup.

◆ cloneRegion()

BoundingCylinder * cloneRegion ( ) const
inlineoverridevirtual

This function should be called clone() but the Visual Studio compilers do not handle covariant return types when multiple inheritance from a virtual base class is involved. Since Region is often combined with other Clonable classes such as ObjectGroup, we don't provide clone() but instead provide cloneRegion() which is effectively doing the same thing, albeit with the annoyance of a different function name.

Note that subclasses will need to tell DataExecution::TypedDataFactory about their cloneRegion() implementation explicitly if they do not also inherit from some other Clonable base class as well, since Region does not derive from Clonable (which means the template specializations for TypedDataFactory will not automatically detect cloneRegion()).

Implements Region.

◆ contains()

bool contains ( const Vector3d p) const
overridevirtual
Parameters
pThe point to test.
Returns
True if the point p is contained within the region. If p falls on the boundary of the region, the result returned must also be true. If the region is a null region (ie isNull() returns true), this function must return false.

The computation for a bounding cylinder is relatively expensive. The current implementation uses three square root calculations. This may be optimized in future by pre-calculating some quantities to reduce this down to one square root calculation.

Implements Region.

◆ destroy()

void destroy ( )
overridevirtual

Destroys the object. This function is usually implemented by calling operator delete on the object.

See also
clone()

Implements Region.

◆ getBoundingBox()

bool getBoundingBox ( Vector3d minimum,
Vector3d maximum 
) const
overridevirtual
Parameters
minimumIf the function returns true, then at exit this will hold the corner of the bounding box corresponding to the minimum values of X, Y and Z.
maximumIf the function returns true, then at exit this will hold the corner of the bounding box corresponding to the maximum values of X, Y and Z.

The bounding box is guaranteed to contain all the regions for which a point passed to contains() will return true. It can be useful as a way of short-circuiting a more expensive test for whether a point is contained in a complex region. How conservative the bounding box is will be determined entirely by the subclass. It is allowable for the subclass to return the entire 3D domain as the bounding box (and indeed some subclasses logically have to do this, such as RegionNegate).

Returns
True if the bounding box could be defined. A return value of false would normally indicate that the region is null.
See also
getBoundingSphere(), isNull()

The implementation of this function in BoundingCylinder errs on the side of being computationally inexpensive at the cost of defining a larger than necessary bounding box if the cylinder is not axis-aligned. This is so that requests for calculating the bounding box are quick and therefore can be called frequently as an optimization for avoiding the more expensive call to contains().

Implements Region.

◆ getBoundingSphere()

bool getBoundingSphere ( Vector3d center,
double &  radius 
) const
overridevirtual
Parameters
centerThis will hold the center of the bounding cylinder if the function is successful. If not successful, the function leaves it unmodified from the passed in value.
radiusThis will hold the radius of the bounding cylinder if the function is successful. If not successful, the function leaves it unmodified from the passed in value.

If the bounding cylinder is not null, this function always succeeds. Unlike getBoundingBox(), the calculation of the bounding sphere returns the smallest possible radius that bounds the cylinder. This is because the use of a square root in the calculation is unavoidable so the exact calculation is no worse than any other approximation from a computational cost perspective.

Returns
True if the bounding cylinder is not null.
See also
getBoundingBox(), isNull()

Reimplemented from Region.

◆ getCenterA()

Vector3d getCenterA ( ) const
Returns
The center of the bounding cylinder at end A.
Precondition
The bounding cylinder must not be null.
See also
setCenterA(), getCenterB(), isNull()

◆ getCenterB()

Vector3d getCenterB ( ) const
Returns
The center of the bounding cylinder at end B.
Precondition
The bounding cylinder must not be null.
See also
setCenterB(), getCenterA(), isNull()

◆ getRadius()

double getRadius ( ) const
Returns
The radius of the bounding cylinder.
Precondition
The bounding cylinder must not be null.
See also
setRadius(), isNull()

◆ isNull()

bool isNull ( ) const
overridevirtual
Returns
True if the bounding cylinder is null. A cylinder with both face centers in the same location or zero radius is not considered to be null.

Implements Region.

◆ operator!=()

bool operator!= ( const BoundingCylinder v) const
inline

◆ operator==()

bool operator== ( const BoundingCylinder b) const

◆ setCenterA()

void setCenterA ( const Vector3d c)
Parameters
cThe new center of the cylinder at end A.
See also
getCenterA(), setCenterB(), setRadius()

◆ setCenterB()

void setCenterB ( const Vector3d c)
Parameters
cThe new center of the cylinder at end B.
See also
getCenterB(), setCenterA(), setRadius()

◆ setRadius()

void setRadius ( double  r)
Parameters
rThe new radius of the cylinder.
See also
getRadius(), setCenterA(), setCenterB()

◆ visit()

bool visit ( RegionProcessor processor)
overridevirtual

Visit the specified region processor, invoking the correct processing function. Subclasses will need to override this to invoke the correct function.

Implements Region.