15#include <jama/jama_svd.h>
18#include "IException.h"
20#include "LeastSquares.h"
21#include "PolynomialBivariate.h"
63 for(
int i = 0 ; i < ident.dim2() ; i++) {
93 const double xp[],
const double yp[],
int n) {
101 for(
int i = 0; i < n; i++) {
102 vector<double> coord(2);
105 xpLSQ.AddKnown(coord,
xp[i]);
106 ypLSQ.AddKnown(coord,
yp[i]);
114 p_matrix[0][0] = xpFunc.Coefficient(1);
115 p_matrix[0][1] = xpFunc.Coefficient(2);
116 p_matrix[0][2] = xpFunc.Coefficient(0);
117 p_matrix[1][0] = ypFunc.Coefficient(1);
118 p_matrix[1][1] = ypFunc.Coefficient(2);
119 p_matrix[1][2] = ypFunc.Coefficient(0);
154 double angleRadians = angle *
Isis::PI / 180.0;
155 rot[0][0] = cos(angleRadians);
156 rot[0][1] = -sin(angleRadians);
157 rot[1][0] = sin(angleRadians);
158 rot[1][1] = cos(angleRadians);
161 angleRadians = -angleRadians;
162 rot[0][0] = cos(angleRadians);
163 rot[0][1] = -sin(angleRadians);
164 rot[1][0] = sin(angleRadians);
165 rot[1][1] = cos(angleRadians);
176 scale[0][0] = scaleFactor;
177 scale[1][1] = scaleFactor;
222 vector <double> coef;
239 vector <double> coef;
252 if((am.dim1() != 3) && (am.dim2() != 3)) {
254 mess <<
"Affine matrices must be 3x3 - this one is " << am.dim1()
276 JAMA::SVD<double> svd(a);
284 for(
int i = 0; i < invS.dim1(); i++) {
285 if(invS[i][i] == 0.0) {
286 string msg =
"Affine transform not invertible";
289 invS[i][i] = 1.0 / invS[i][i];
295 AMatrix transU(U.dim2(), U.dim1());
296 for(
int r = 0; r < U.dim1(); r++) {
297 for(
int c = 0; c < U.dim2(); c++) {
298 transU[c][r] = U[r][c];
303 AMatrix VinvS = TNT::matmult(V, invS);
304 return (TNT::matmult(VinvS, transU));
std::vector< double > Coefficients(int var)
Return the affine coeffients for the entered variable (1 or 2).
void ComputeInverse(double xp, double yp)
Compute (x,y) given (xp,yp).
double xp() const
Returns the computed x'.
double p_xp
x' value of the (x',y') coordinate
double y() const
Returns the computed y.
AMatrix p_matrix
Affine forward matrix.
AMatrix p_invmat
Affine inverse matrix.
void Translate(double tx, double ty)
Apply a translation to the current affine transform.
static AMatrix getIdentity()
Return an Affine identity matrix.
double yp() const
Returns the computed y'.
double p_yp
y' value of the (x',y') coordinate
TNT::Array2D< double > AMatrix
Affine Matrix.
void Scale(double scaleFactor)
Apply a scale to the current affine transform.
AMatrix invert(const AMatrix &a) const
Compute the inverse of a matrix.
double p_y
y value of the (x,y) coordinate
void Compute(double x, double y)
Compute (xp,yp) given (x,y).
~Affine()
Destroys the Affine object.
double p_x
x value of the (x,y) coordinate
Affine()
Constructs an Affine transform.
void Identity()
Set the forward and inverse affine transform to the identity.
void Solve(const double x[], const double y[], const double xp[], const double yp[], int n)
Given a set of coordinate pairs (n >= 3), compute the affine transform that best fits the points.
void checkDims(const AMatrix &am) const
Checks affine matrix to ensure it is a 3x3 standard form transform.
std::vector< double > InverseCoefficients(int var)
Return the inverse affine coeffients for the entered variable (1 or 2).
void Rotate(double rot)
Apply a translation to the current affine transform.
double x() const
Returns the computed x.
@ Unknown
A type of error that cannot be classified as any of the other error types.
@ Programmer
This error is for when a programmer made an API call that was illegal.
Generic least square fitting class.
Nth degree Polynomial with two variables.
This is free and unencumbered software released into the public domain.
const double PI
The mathematical constant PI.
Namespace for the standard library.