diff options
Diffstat (limited to 'src/libnr/nr-rotate.h')
| -rw-r--r-- | src/libnr/nr-rotate.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/libnr/nr-rotate.h b/src/libnr/nr-rotate.h new file mode 100644 index 000000000..051372ce6 --- /dev/null +++ b/src/libnr/nr-rotate.h @@ -0,0 +1,66 @@ +#ifndef SEEN_NR_ROTATE_H +#define SEEN_NR_ROTATE_H + +/** \file + * Rotation about the origin. + */ + +#include <libnr/nr-point.h> +#include <libnr/nr-point-fns.h> +#include <libnr/nr-point-ops.h> + +namespace NR { + +/** Notionally an NR::Matrix corresponding to rotation about the origin. + Behaves like NR::Matrix for multiplication. +**/ +class rotate { +public: + Point vec; + +private: + rotate(); + +public: + explicit rotate(Coord theta); + explicit rotate(Point const &p) : vec(p) {} + explicit rotate(Coord const x, Coord const y) : vec(x, y) {} + + bool operator==(rotate const &o) const { + return vec == o.vec; + } + + bool operator!=(rotate const &o) const { + return vec != o.vec; + } + + inline rotate &operator*=(rotate const &b); + /* Defined in nr-rotate-ops.h. */ + + rotate inverse() const { + /** \todo + * In the usual case that vec is a unit vector (within rounding error), + * dividing by len_sq is either a noop or numerically harmful. + * Make a unit_rotate class (or the like) that knows its length is 1. + */ + double const len_sq = dot(vec, vec); + return rotate( Point(vec[X], -vec[Y]) + / len_sq ); + } +}; + +} /* namespace NR */ + + +#endif /* !SEEN_NR_ROTATE_H */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : |
