You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
6.3 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkTransform2D.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkTransform2D
* @brief describes linear transformations via a 3x3 matrix
*
* A vtkTransform2D can be used to describe the full range of linear (also
* known as affine) coordinate transformations in two dimensions,
* which are internally represented as a 3x3 homogeneous transformation
* matrix. When you create a new vtkTransform2D, it is always initialized
* to the identity transformation.
*
* All multiplicitive operations (Translate, Rotate, Scale, etc) are
* post-multiplied in this class (i.e. add them in the reverse of the order
* that they should be applied).
*
* This class performs all of its operations in a right handed
* coordinate system with right handed rotations. Some other graphics
* libraries use left handed coordinate systems and rotations.
*/
#ifndef vtkTransform2D_h
#define vtkTransform2D_h
#include "vtkCommonTransformsModule.h" // For export macro
#include "vtkObject.h"
#include "vtkMatrix3x3.h" // Needed for inline methods
class vtkPoints2D;
class VTKCOMMONTRANSFORMS_EXPORT vtkTransform2D : public vtkObject
{
public:
static vtkTransform2D* New();
vtkTypeMacro(vtkTransform2D, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Set the transformation to the identity transformation.
*/
void Identity();
/**
* Invert the transformation.
*/
void Inverse();
/**
* Create a translation matrix and concatenate it with the current
* transformation.
*/
void Translate(double x, double y);
void Translate(const double x[2]) { this->Translate(x[0], x[1]); }
void Translate(const float x[2]) { this->Translate(x[0], x[1]); }
/**
* Create a rotation matrix and concatenate it with the current
* transformation. The angle is in degrees.
*/
void Rotate(double angle);
/**
* Create a scale matrix (i.e. set the diagonal elements to x, y)
* and concatenate it with the current transformation.
*/
void Scale(double x, double y);
void Scale(const double s[2]) { this->Scale(s[0], s[1]); }
void Scale(const float s[2]) { this->Scale(s[0], s[1]); }
/**
* Set the current matrix directly.
*/
void SetMatrix(vtkMatrix3x3* matrix) { this->SetMatrix(matrix->GetData()); }
void SetMatrix(const double elements[9]);
//@{
/**
* Get the underlying 3x3 matrix.
*/
vtkGetObjectMacro(Matrix, vtkMatrix3x3);
void GetMatrix(vtkMatrix3x3* matrix);
//@}
//@{
/**
* Return the position from the current transformation matrix as an array
* of two floating point numbers. This is simply returning the translation
* component of the 3x3 matrix.
*/
void GetPosition(double pos[2]);
void GetPosition(float pos[2])
{
double temp[2];
this->GetPosition(temp);
pos[0] = static_cast<float>(temp[0]);
pos[1] = static_cast<float>(temp[1]);
}
//@}
//@{
/**
* Return the x and y scale from the current transformation matrix as an array
* of two floating point numbers. This is simply returning the scale
* component of the 3x3 matrix.
*/
void GetScale(double pos[2]);
void GetScale(float pos[2])
{
double temp[2];
this->GetScale(temp);
pos[0] = static_cast<float>(temp[0]);
pos[1] = static_cast<float>(temp[1]);
}
//@}
/**
* Return a matrix which is the inverse of the current transformation
* matrix.
*/
void GetInverse(vtkMatrix3x3* inverse);
/**
* Return a matrix which is the transpose of the current transformation
* matrix. This is equivalent to the inverse if and only if the
* transformation is a pure rotation with no translation or scale.
*/
void GetTranspose(vtkMatrix3x3* transpose);
/**
* Override GetMTime to account for input and concatenation.
*/
vtkMTimeType GetMTime() override;
/**
* Apply the transformation to a series of points, and append the
* results to outPts. Where n is the number of points, and the float pointers
* are of length 2*n.
*/
void TransformPoints(const float* inPts, float* outPts, int n);
/**
* Apply the transformation to a series of points, and append the
* results to outPts. Where n is the number of points, and the float pointers
* are of length 2*n.
*/
void TransformPoints(const double* inPts, double* outPts, int n);
/**
* Apply the transformation to a series of points, and append the
* results to outPts.
*/
void TransformPoints(vtkPoints2D* inPts, vtkPoints2D* outPts);
/**
* Apply the transformation to a series of points, and append the
* results to outPts. Where n is the number of points, and the float pointers
* are of length 2*n.
*/
void InverseTransformPoints(const float* inPts, float* outPts, int n);
/**
* Apply the transformation to a series of points, and append the
* results to outPts. Where n is the number of points, and the float pointers
* are of length 2*n.
*/
void InverseTransformPoints(const double* inPts, double* outPts, int n);
/**
* Apply the transformation to a series of points, and append the
* results to outPts.
*/
void InverseTransformPoints(vtkPoints2D* inPts, vtkPoints2D* outPts);
//@{
/**
* Use this method only if you wish to compute the transformation in
* homogeneous (x,y,w) coordinates, otherwise use TransformPoint().
* This method calls this->GetMatrix()->MultiplyPoint().
*/
void MultiplyPoint(const float in[3], float out[3]) { this->GetMatrix()->MultiplyPoint(in, out); }
void MultiplyPoint(const double in[3], double out[3])
{
this->GetMatrix()->MultiplyPoint(in, out);
}
//@}
protected:
vtkTransform2D();
~vtkTransform2D() override;
void InternalDeepCopy(vtkTransform2D* t);
vtkMatrix3x3* Matrix;
vtkMatrix3x3* InverseMatrix;
private:
vtkTransform2D(const vtkTransform2D&) = delete;
void operator=(const vtkTransform2D&) = delete;
};
#endif