93 lines
2.0 KiB
C
93 lines
2.0 KiB
C
|
/**
|
||
|
@file Cylinder.h
|
||
|
|
||
|
@maintainer Morgan McGuire, http://graphics.cs.williams.edu
|
||
|
|
||
|
@created 2003-02-07
|
||
|
@edited 2005-09-26
|
||
|
|
||
|
Copyright 2000-2005, Morgan McGuire.
|
||
|
All rights reserved.
|
||
|
*/
|
||
|
|
||
|
#ifndef G3D_Cylinder_H
|
||
|
#define G3D_Cylinder_H
|
||
|
|
||
|
#include "G3D/platform.h"
|
||
|
#include "G3D/g3dmath.h"
|
||
|
#include "G3D/Vector3.h"
|
||
|
|
||
|
namespace G3D {
|
||
|
|
||
|
class Line;
|
||
|
class AABox;
|
||
|
/**
|
||
|
Right cylinder
|
||
|
*/
|
||
|
class Cylinder {
|
||
|
private:
|
||
|
Vector3 p1;
|
||
|
Vector3 p2;
|
||
|
|
||
|
float mRadius;
|
||
|
|
||
|
public:
|
||
|
|
||
|
/** Uninitialized */
|
||
|
Cylinder();
|
||
|
Cylinder(class BinaryInput& b);
|
||
|
Cylinder(const Vector3& _p1, const Vector3& _p2, float _r);
|
||
|
void serialize(class BinaryOutput& b) const;
|
||
|
void deserialize(class BinaryInput& b);
|
||
|
|
||
|
/** The line down the center of the Cylinder */
|
||
|
Line axis() const;
|
||
|
|
||
|
/**
|
||
|
A reference frame in which the center of mass is at the origin and
|
||
|
the Y-axis is the cylinder's axis. If the cylinder is transformed, this reference frame
|
||
|
may freely rotate around its axis.*/
|
||
|
void getReferenceFrame(class CoordinateFrame& cframe) const;
|
||
|
|
||
|
/** Returns point 0 or 1 */
|
||
|
inline const Vector3& point(int i) const {
|
||
|
debugAssert(i >= 0 && i <= 1);
|
||
|
return (i == 0) ? p1 : p2;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns true if the point is inside the Cylinder or on its surface.
|
||
|
*/
|
||
|
bool contains(const Vector3& p) const;
|
||
|
|
||
|
float area() const;
|
||
|
|
||
|
float volume() const;
|
||
|
|
||
|
float radius() const;
|
||
|
|
||
|
/** Center of mass */
|
||
|
inline Vector3 center() const {
|
||
|
return (p1 + p2) / 2.0f;
|
||
|
}
|
||
|
|
||
|
inline float height() const {
|
||
|
return (p1 - p2).magnitude();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Get close axis aligned bounding box.
|
||
|
With vertical world orientation, the top and bottom might not be very tight. */
|
||
|
void getBounds(AABox& out) const;
|
||
|
|
||
|
/** Random world space point with outward facing normal. */
|
||
|
void getRandomSurfacePoint(Vector3& P, Vector3& N) const;
|
||
|
|
||
|
/** Point selected uniformly at random over the volume. */
|
||
|
Vector3 randomInteriorPoint() const;
|
||
|
};
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
#endif
|