mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 22:02:58 -06:00
123 lines
2 KiB
C++
123 lines
2 KiB
C++
#include "TransMatrix.h"
|
|
|
|
// constructor
|
|
TransMatrix::TransMatrix(void)
|
|
{
|
|
SetIdentity();
|
|
}
|
|
|
|
TransMatrix::TransMatrix(TransMatrix const &m)
|
|
{
|
|
c = m.c;
|
|
s = m.s;
|
|
tx = m.tx;
|
|
ty = m.ty;
|
|
}
|
|
|
|
// sets to null transformation
|
|
TransMatrix &TransMatrix::SetIdentity(void)
|
|
{
|
|
c = 1;
|
|
s = 0;
|
|
tx = ty = 0;
|
|
return *this;
|
|
}
|
|
|
|
// multiply by another matrix
|
|
TransMatrix &TransMatrix::Multiply(TransMatrix const &m)
|
|
{
|
|
double cx = c * m.c - s * m.s;
|
|
double sx = s * m.c + c * m.s;
|
|
double txx = c * m.tx - s * m.ty + tx;
|
|
double tyx = s * m.tx + c * m.ty + ty;
|
|
|
|
c = cx;
|
|
s = sx;
|
|
tx = txx;
|
|
ty = tyx;
|
|
return *this;
|
|
}
|
|
|
|
// invert
|
|
TransMatrix &TransMatrix::Invert(TransMatrix const &m)
|
|
{
|
|
double txi = -tx * c - ty * s;
|
|
double tyi = tx * s - ty * c;
|
|
|
|
s = -s;
|
|
tx = txi;
|
|
ty = tyi;
|
|
return *this;
|
|
}
|
|
|
|
// translate by given distance
|
|
TransMatrix &TransMatrix::Translate(double dx, double dy)
|
|
{
|
|
tx += c * dx - s * dy;
|
|
ty += s * dx + c * dy;
|
|
return *this;
|
|
}
|
|
|
|
TransMatrix &TransMatrix::Translate(Pointf const &p)
|
|
{
|
|
tx += c * p.x - s * p.y;
|
|
ty += s * p.x + c * p.y;
|
|
return *this;
|
|
}
|
|
|
|
// rotate
|
|
TransMatrix &TransMatrix::Rotate(double a)
|
|
{
|
|
double s2 = sin(a);
|
|
double c2 = cos(a);
|
|
double cx = c * c2 - s * s2;
|
|
double sx = s * c2 + c * s2;
|
|
c = cx;
|
|
s = sx;
|
|
return *this;
|
|
}
|
|
|
|
TransMatrix &TransMatrix::Rotate(Pointf const ¢er, double a)
|
|
{
|
|
Translate(center);
|
|
Rotate(a);
|
|
return Translate(-center);
|
|
}
|
|
|
|
// scale
|
|
TransMatrix &TransMatrix::Scale(double f)
|
|
{
|
|
c *= f;
|
|
s *= f;
|
|
return *this;
|
|
}
|
|
|
|
// transform a point
|
|
Pointf TransMatrix::operator()(Pointf const &p) const
|
|
{
|
|
return Pointf(c * p.x - s * p.y + tx, s * p.x + c * p.y + ty);
|
|
}
|
|
|
|
// rotate an angle by rotation part of matrix
|
|
double TransMatrix::R(double a) const
|
|
{
|
|
double angle = acos(c / sqrt(c * c + s * s));
|
|
return a + angle;
|
|
}
|
|
|
|
// scale a distance with scale part of matrix
|
|
double TransMatrix::S(double d) const
|
|
{
|
|
double scale = sqrt(c * c + s * s);
|
|
return d * scale;
|
|
}
|
|
|
|
TransMatrix &TransMatrix::operator=(TransMatrix const &m)
|
|
{
|
|
c = m.c;
|
|
s = m.s;
|
|
tx = m.tx;
|
|
ty = m.ty;
|
|
return *this;
|
|
}
|
|
|