Blame src/lib/VectorTransformation2D.cpp

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: */