polly-b-gone/physics/rotation.h
2012-12-14 09:47:48 -08:00

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