|
rpm-build |
9243a4 |
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
rpm-build |
9243a4 |
/*
|
|
rpm-build |
9243a4 |
* This file is part of the libmspub project.
|
|
rpm-build |
9243a4 |
*
|
|
rpm-build |
9243a4 |
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
rpm-build |
9243a4 |
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
rpm-build |
9243a4 |
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
rpm-build |
9243a4 |
*/
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
//TODO : Adjust handles, glue points
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
#include "VectorTransformation2D.h"
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
#include <math.h>
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
namespace libmspub
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
VectorTransformation2D::VectorTransformation2D() : m_m11(1), m_m12(0), m_m21(0), m_m22(1), m_x(0), m_y(0)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
//We choose by convention to make function composition LEFT-multiplication, rather than right.
|
|
rpm-build |
9243a4 |
VectorTransformation2D operator*(const VectorTransformation2D &l, const VectorTransformation2D &r)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
VectorTransformation2D ret;
|
|
rpm-build |
9243a4 |
ret.m_m11 = l.m_m11 * r.m_m11 + l.m_m12 * r.m_m21;
|
|
rpm-build |
9243a4 |
ret.m_m12 = l.m_m11 * r.m_m12 + l.m_m12 * r.m_m22;
|
|
rpm-build |
9243a4 |
ret.m_m21 = l.m_m21 * r.m_m11 + l.m_m22 * r.m_m21;
|
|
rpm-build |
9243a4 |
ret.m_m22 = l.m_m21 * r.m_m12 + l.m_m22 * r.m_m22;
|
|
rpm-build |
9243a4 |
ret.m_x = l.m_m11 * r.m_x + l.m_m12 * r.m_y + l.m_x;
|
|
rpm-build |
9243a4 |
ret.m_y = l.m_m21 * r.m_x + l.m_m22 * r.m_y + l.m_y;
|
|
rpm-build |
9243a4 |
return ret;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
VectorTransformation2D VectorTransformation2D::fromFlips(bool flipH, bool flipV)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
VectorTransformation2D ret;
|
|
rpm-build |
9243a4 |
ret.m_m21 = ret.m_m12 = 0;
|
|
rpm-build |
9243a4 |
ret.m_m11 = flipH ? -1 : 1;
|
|
rpm-build |
9243a4 |
ret.m_m22 = flipV ? -1 : 1;
|
|
rpm-build |
9243a4 |
return ret;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
VectorTransformation2D VectorTransformation2D::fromTranslate(double x, double y)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
VectorTransformation2D ret;
|
|
rpm-build |
9243a4 |
ret.m_m11 = ret.m_m22 = 1;
|
|
rpm-build |
9243a4 |
ret.m_m21 = ret.m_m12 = 0;
|
|
rpm-build |
9243a4 |
ret.m_x = x;
|
|
rpm-build |
9243a4 |
ret.m_y = y;
|
|
rpm-build |
9243a4 |
return ret;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
VectorTransformation2D VectorTransformation2D::fromCounterRadians(double theta)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
VectorTransformation2D ret;
|
|
rpm-build |
9243a4 |
ret.m_m11 = cos(theta);
|
|
rpm-build |
9243a4 |
ret.m_m12 = -sin(theta);
|
|
rpm-build |
9243a4 |
ret.m_m21 = sin(theta);
|
|
rpm-build |
9243a4 |
ret.m_m22 = cos(theta);
|
|
rpm-build |
9243a4 |
return ret;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
Vector2D VectorTransformation2D::transform(Vector2D v) const
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
double x = m_m11 * v.m_x + m_m12 * v.m_y + m_x;
|
|
rpm-build |
9243a4 |
double y = m_m21 * v.m_x + m_m22 * v.m_y + m_y;
|
|
rpm-build |
9243a4 |
return Vector2D(x, y);
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
Vector2D VectorTransformation2D::transformWithOrigin(Vector2D v, Vector2D origin) const
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
return transform(v - origin) + origin;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
Vector2D operator+(const Vector2D &l, const Vector2D &r)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
double x = l.m_x + r.m_x;
|
|
rpm-build |
9243a4 |
double y = l.m_y + r.m_y;
|
|
rpm-build |
9243a4 |
return Vector2D(x, y);
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
Vector2D operator-(const Vector2D &l, const Vector2D &r)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
double x = l.m_x - r.m_x;
|
|
rpm-build |
9243a4 |
double y = l.m_y - r.m_y;
|
|
rpm-build |
9243a4 |
return Vector2D(x, y);
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
double VectorTransformation2D::getRotation() const
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
if (fabs(getHorizontalScaling()) > 0.0001)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
return atan2(m_m21, m_m11);
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
if (fabs(getVerticalScaling()) > 0.0001)
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
return atan2(-m_m12, m_m22);
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
return 0;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
double VectorTransformation2D::getHorizontalScaling() const
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
return m_m11 * m_m11 + m_m21 * m_m21;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
double VectorTransformation2D::getVerticalScaling() const
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
return m_m12 * m_m12 + m_m22 * m_m22;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
bool VectorTransformation2D::orientationReversing() const
|
|
rpm-build |
9243a4 |
{
|
|
rpm-build |
9243a4 |
// Is the determinant negative?
|
|
rpm-build |
9243a4 |
return m_m11 * m_m22 < m_m12 * m_m21;
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
}
|
|
rpm-build |
9243a4 |
|
|
rpm-build |
9243a4 |
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */
|