79 lines
1.9 KiB
C++
79 lines
1.9 KiB
C++
// -*- C++ -*-
|
|
|
|
#ifndef MBOSTOCK_ROTATION_H
|
|
#define MBOSTOCK_ROTATION_H
|
|
|
|
#include "shape.h"
|
|
#include "vector.h"
|
|
#include "transform.h"
|
|
|
|
namespace mbostock {
|
|
|
|
/**
|
|
* Computes a rotation matrix for a given origin, axis and angle. This is
|
|
* roughly the equivalent to a glTranslatef and glRotatef call in OpenGL.
|
|
*/
|
|
class Rotation : public Transform {
|
|
public:
|
|
Rotation(const Vector& origin, const Vector& axis,
|
|
float speed, float angle);
|
|
|
|
/** Rotates the specified point. */
|
|
Vector point(const Vector& x) const;
|
|
|
|
/** Inverse-rotates the specified point. */
|
|
Vector pointInverse(const Vector& x) const;
|
|
|
|
/** Rotates the specified vector. */
|
|
Vector vector(const Vector& x) const;
|
|
|
|
/** Inverse-rotates the specified vector. */
|
|
Vector vectorInverse(const Vector& x) const;
|
|
|
|
/** Returns the rotation's origin. */
|
|
inline const Vector& origin() const { return origin_; }
|
|
|
|
/** Returns the rotation's axis. */
|
|
inline const Vector& axis() const { return axis_; }
|
|
|
|
/** Returns the rotation's angle (in degrees, in the range [0, 360]). */
|
|
inline float angle() const { return angle_; }
|
|
|
|
/** Returns the speed of the rotation (in degrees per time step). */
|
|
inline float speed() const { return speed_; }
|
|
|
|
/** Advances the rotation by one time step. */
|
|
virtual void step();
|
|
|
|
/** Resets the rotation. */
|
|
virtual void reset();
|
|
|
|
/** Returns the velocity of the given point. */
|
|
Vector velocity(const Vector& x) const;
|
|
|
|
private:
|
|
void update();
|
|
|
|
Vector origin_;
|
|
Vector axis_;
|
|
float startAngle_;
|
|
float angle_;
|
|
float speed_;
|
|
float matrix_[9];
|
|
};
|
|
|
|
class RotatingShape : public Shape {
|
|
public:
|
|
RotatingShape(const Shape& s, const Rotation& r);
|
|
|
|
virtual bool intersects(const Sphere& s) const;
|
|
virtual Projection project(const Vector& x) const;
|
|
|
|
private:
|
|
const Shape& shape_;
|
|
const Rotation& rotation_;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|