Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Mat2.cpp
- Committer:
- BartJanssens
- Date:
- 2016-01-05
- Revision:
- 1:e25ff4b06ed2
- Parent:
- 0:785cff1e5a7c
File content as of revision 1:e25ff4b06ed2:
/*
File: Mat2.cpp
Function: Implements Mat2.h
Author(s): Andrew Willmott
Copyright: (c) 1995-2001, Andrew Willmott
*/
#include "Mat2.h"
//#include <cctype>
//#include <iomanip>
#include "Utils.h"
Bool Mat2::operator == (const Mat2 &m) const
{
return(row[0] == m[0] && row[1] == m[1]);
}
Bool Mat2::operator != (const Mat2 &m) const
{
return(row[0] != m[0] || row[1] != m[1]);
}
Real det(const Mat2 &m)
{
return(dot(m[0], cross(m[1])));
}
Mat2 inv(const Mat2 &m)
{
Real mDet;
Mat2 result;
result[0][0] = m[1][1]; result[0][1] = -m[0][1];
result[1][0] = -m[1][0]; result[1][1] = m[0][0];
mDet = m[0][0] * result[0][0] + m[0][1] * result[1][0];
Assert(mDet != 0.0, "(Mat2::inv) matrix is non-singular");
result /= mDet;
return(result);
}
Mat2 oprod(const Vec2 &a, const Vec2 &b)
// returns outerproduct of a and b: a * trans(b)
{
Mat2 result;
result[0] = a[0] * b;
result[1] = a[1] * b;
return(result);
}
void printMat2(const Mat2 &m)
{
printf("[");
printVec2(m[0]);
printf("\r\n");
printVec2(m[1]);
printf("]\r\n");
}
/*
ostream &operator << (ostream &s, const Mat2 &m)
{
Int w = s.width();
return(s << '[' << m[0] << "\r\n" << setw(w) << m[1] << ']' << "\r\n");
}
istream &operator >> (istream &s, Mat2 &m)
{
Mat2 result;
Char c;
// Expected format: [[1 2] [3 4]]
// Each vector is a row of the row matrix.
while (s >> c && isspace(c)) // ignore leading white space
;
if (c == '[')
{
s >> result[0] >> result[1];
if (!s)
{
cerr << "Expected number while reading matrix\n";
return(s);
}
while (s >> c && isspace(c))
;
if (c != ']')
{
s.clear(ios::failbit);
cerr << "Expected ']' while reading matrix\n";
return(s);
}
}
else
{
s.clear(ios::failbit);
cerr << "Expected '[' while reading matrix\n";
return(s);
}
m = result;
return(s);
}
*/
Mat2 &Mat2::MakeRot(Real theta)
{
Real c, s;
SetReal(s, sin(theta));
SetReal(c, cos(theta));
#ifdef VL_ROW_ORIENT
row[0][0] = c; row[0][1] = s;
row[1][0] = -s; row[1][1] = c;
#else
row[0][0] = c; row[0][1] = -s;
row[1][0] = s; row[1][1] = c;
#endif
return(SELF);
}
Mat2 &Mat2::MakeScale(const Vec2 &s)
{
row[0][0] = s[0]; row[0][1] = vl_0;
row[1][0] = vl_0; row[1][1] = s[1];
return(SELF);
}