transforms.cpp revision d8fa3c4faade9a5a8e7f79450544b1925e1ade41
#include "transforms.h"
namespace Geom {
Matrix operator*(Translate const &t, Scale const &s) {
Matrix ret(s);
ret[4] = t[X] * s[X];
ret[5] = t[Y] * s[Y];
return ret;
}
Matrix operator*(Translate const &t, Rotate const &r) {
Matrix ret(r);
ret.setTranslation(t.vec * ret);
return ret;
}
Matrix operator*(Scale const &s, Translate const &t) {
return Matrix(s[0], 0,
0 , s[1],
t[0], t[1]);
}
Matrix operator*(Scale const &s, Matrix const &m) {
Matrix ret(m);
ret[0] *= s[X];
ret[1] *= s[X];
ret[2] *= s[Y];
ret[3] *= s[Y];
return ret;
}
Matrix operator*(Matrix const &m, Translate const &t) {
Matrix ret(m);
ret[4] += t[X];
ret[5] += t[Y];
return ret;
}
Matrix operator*(Matrix const &m, Scale const &s) {
Matrix ret(m);
ret[0] *= s[X]; ret[1] *= s[Y];
ret[2] *= s[X]; ret[3] *= s[Y];
ret[4] *= s[X]; ret[5] *= s[Y];
return ret;
}
Translate pow(Translate const &t, int n) {
return Translate(t[0]*n, t[1]*n);
}
Coord pow(Coord x, long n) // shamelessly lifted from WP
{
Coord result = 1;
while ( n ) {
if ( n & 1 ) {
result = result * x;
n = n-1;
}
x = x*x;
n = n/2;
}
return result;
}
Scale pow(Scale const &s, int n) {
return Scale(pow(s[0],n), pow(s[1],n));
}
Rotate pow(Rotate x, long n)
{
Rotate result(0,1); // identity
while ( n ) {
if ( n & 1 ) {
result = result * x;
n = n-1;
}
x = x*x;
n = n/2;
}
return result;
}
Matrix pow(Matrix x, long n)
{
Matrix result;
result.setIdentity();
while ( n ) {
if ( n & 1 ) {
result = result * x;
n = n-1;
}
x = x*x;
n = n/2;
}
return result;
}
}
/*
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 :