120 lines
2.5 KiB
C
120 lines
2.5 KiB
C
|
/**
|
||
|
@file LineSegment.h
|
||
|
|
||
|
@maintainer Morgan McGuire, http://graphics.cs.williams.edu
|
||
|
|
||
|
@created 2003-02-08
|
||
|
@edited 2008-02-02
|
||
|
*/
|
||
|
|
||
|
#ifndef G3D_LINESEGMENT_H
|
||
|
#define G3D_LINESEGMENT_H
|
||
|
|
||
|
#include "G3D/platform.h"
|
||
|
#include "G3D/Vector3.h"
|
||
|
|
||
|
namespace G3D {
|
||
|
|
||
|
/**
|
||
|
An finite segment of an infinite 3D line.
|
||
|
*/
|
||
|
class LineSegment {
|
||
|
protected:
|
||
|
|
||
|
Point3 _point;
|
||
|
|
||
|
/** Not normalized */
|
||
|
Vector3 direction;
|
||
|
|
||
|
LineSegment(const Point3& __point, const Vector3& _direction) : _point(__point), direction(_direction) {
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
|
||
|
LineSegment() : _point(Point3::zero()), direction(Vector3::zero()) {}
|
||
|
|
||
|
LineSegment(class BinaryInput& b);
|
||
|
|
||
|
void serialize(class BinaryOutput& b) const;
|
||
|
|
||
|
void deserialize(class BinaryInput& b);
|
||
|
|
||
|
virtual ~LineSegment() {}
|
||
|
|
||
|
/**
|
||
|
* Constructs a line from two (not equal) points.
|
||
|
*/
|
||
|
static LineSegment fromTwoPoints(const Point3 &point1, const Point3 &point2) {
|
||
|
return LineSegment(point1, point2 - point1);
|
||
|
}
|
||
|
|
||
|
/** Call with 0 or 1 */
|
||
|
Point3 point(int i) const;
|
||
|
|
||
|
Point3 midpoint() const {
|
||
|
return _point + direction * 0.5f;
|
||
|
}
|
||
|
|
||
|
inline float length() const {
|
||
|
return direction.magnitude();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the closest point on the line segment to point.
|
||
|
*/
|
||
|
Point3 closestPoint(const Point3 &point) const;
|
||
|
|
||
|
/**
|
||
|
Returns the distance between point and the line
|
||
|
*/
|
||
|
double distance(const Point3& p) const {
|
||
|
return (closestPoint(p) - p).magnitude();
|
||
|
}
|
||
|
|
||
|
double distanceSquared(const Point3& p) const {
|
||
|
return (closestPoint(p) - p).squaredMagnitude();
|
||
|
}
|
||
|
|
||
|
/** Returns true if some part of this segment is inside the sphere */
|
||
|
bool intersectsSolidSphere(const class Sphere& s) const;
|
||
|
|
||
|
Point3 randomPoint() const;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
class LineSegment2D {
|
||
|
private:
|
||
|
|
||
|
Point2 m_origin;
|
||
|
|
||
|
/** Not normalized */
|
||
|
Vector2 m_direction;
|
||
|
|
||
|
/** Length of m_direction */
|
||
|
float m_length;
|
||
|
|
||
|
public:
|
||
|
|
||
|
LineSegment2D() {}
|
||
|
|
||
|
static LineSegment2D fromTwoPoints(const Point2& p0, const Vector2& p1);
|
||
|
|
||
|
/** Returns the intersection of these segements (including
|
||
|
testing endpoints), or Point2::inf() if they do not intersect. */
|
||
|
Point2 intersection(const LineSegment2D& other) const;
|
||
|
|
||
|
Point2 point(int i) const;
|
||
|
|
||
|
Point2 closestPoint(const Point2& Q) const;
|
||
|
|
||
|
float distance(const Point2& p) const;
|
||
|
|
||
|
float length() const;
|
||
|
};
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
|
||
|
#endif
|