Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

Committer:
BartJanssens
Date:
Tue Jan 05 13:37:50 2016 +0000
Revision:
1:e25ff4b06ed2
Parent:
0:785cff1e5a7c
fixed va_list bug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:785cff1e5a7c 1 /*
BartJanssens 0:785cff1e5a7c 2 File: Mat2.cpp
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Implements Mat2.h
BartJanssens 0:785cff1e5a7c 5
BartJanssens 0:785cff1e5a7c 6 Author(s): Andrew Willmott
BartJanssens 0:785cff1e5a7c 7
BartJanssens 0:785cff1e5a7c 8 Copyright: (c) 1995-2001, Andrew Willmott
BartJanssens 0:785cff1e5a7c 9
BartJanssens 0:785cff1e5a7c 10 */
BartJanssens 0:785cff1e5a7c 11
BartJanssens 0:785cff1e5a7c 12 #include "Mat2.h"
BartJanssens 0:785cff1e5a7c 13 //#include <cctype>
BartJanssens 0:785cff1e5a7c 14 //#include <iomanip>
BartJanssens 0:785cff1e5a7c 15 #include "Utils.h"
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17
BartJanssens 0:785cff1e5a7c 18 Bool Mat2::operator == (const Mat2 &m) const
BartJanssens 0:785cff1e5a7c 19 {
BartJanssens 0:785cff1e5a7c 20 return(row[0] == m[0] && row[1] == m[1]);
BartJanssens 0:785cff1e5a7c 21 }
BartJanssens 0:785cff1e5a7c 22
BartJanssens 0:785cff1e5a7c 23 Bool Mat2::operator != (const Mat2 &m) const
BartJanssens 0:785cff1e5a7c 24 {
BartJanssens 0:785cff1e5a7c 25 return(row[0] != m[0] || row[1] != m[1]);
BartJanssens 0:785cff1e5a7c 26 }
BartJanssens 0:785cff1e5a7c 27
BartJanssens 0:785cff1e5a7c 28
BartJanssens 0:785cff1e5a7c 29 Real det(const Mat2 &m)
BartJanssens 0:785cff1e5a7c 30 {
BartJanssens 0:785cff1e5a7c 31 return(dot(m[0], cross(m[1])));
BartJanssens 0:785cff1e5a7c 32 }
BartJanssens 0:785cff1e5a7c 33
BartJanssens 0:785cff1e5a7c 34 Mat2 inv(const Mat2 &m)
BartJanssens 0:785cff1e5a7c 35 {
BartJanssens 0:785cff1e5a7c 36 Real mDet;
BartJanssens 0:785cff1e5a7c 37 Mat2 result;
BartJanssens 0:785cff1e5a7c 38
BartJanssens 0:785cff1e5a7c 39 result[0][0] = m[1][1]; result[0][1] = -m[0][1];
BartJanssens 0:785cff1e5a7c 40 result[1][0] = -m[1][0]; result[1][1] = m[0][0];
BartJanssens 0:785cff1e5a7c 41
BartJanssens 0:785cff1e5a7c 42 mDet = m[0][0] * result[0][0] + m[0][1] * result[1][0];
BartJanssens 0:785cff1e5a7c 43 Assert(mDet != 0.0, "(Mat2::inv) matrix is non-singular");
BartJanssens 0:785cff1e5a7c 44 result /= mDet;
BartJanssens 0:785cff1e5a7c 45
BartJanssens 0:785cff1e5a7c 46 return(result);
BartJanssens 0:785cff1e5a7c 47 }
BartJanssens 0:785cff1e5a7c 48
BartJanssens 0:785cff1e5a7c 49 Mat2 oprod(const Vec2 &a, const Vec2 &b)
BartJanssens 0:785cff1e5a7c 50 // returns outerproduct of a and b: a * trans(b)
BartJanssens 0:785cff1e5a7c 51 {
BartJanssens 0:785cff1e5a7c 52 Mat2 result;
BartJanssens 0:785cff1e5a7c 53
BartJanssens 0:785cff1e5a7c 54 result[0] = a[0] * b;
BartJanssens 0:785cff1e5a7c 55 result[1] = a[1] * b;
BartJanssens 0:785cff1e5a7c 56
BartJanssens 0:785cff1e5a7c 57 return(result);
BartJanssens 0:785cff1e5a7c 58 }
BartJanssens 0:785cff1e5a7c 59
BartJanssens 0:785cff1e5a7c 60 void printMat2(const Mat2 &m)
BartJanssens 0:785cff1e5a7c 61 {
BartJanssens 0:785cff1e5a7c 62 printf("[");
BartJanssens 0:785cff1e5a7c 63 printVec2(m[0]);
BartJanssens 0:785cff1e5a7c 64 printf("\r\n");
BartJanssens 0:785cff1e5a7c 65 printVec2(m[1]);
BartJanssens 0:785cff1e5a7c 66 printf("]\r\n");
BartJanssens 0:785cff1e5a7c 67 }
BartJanssens 0:785cff1e5a7c 68
BartJanssens 0:785cff1e5a7c 69 /*
BartJanssens 0:785cff1e5a7c 70 ostream &operator << (ostream &s, const Mat2 &m)
BartJanssens 0:785cff1e5a7c 71 {
BartJanssens 0:785cff1e5a7c 72 Int w = s.width();
BartJanssens 0:785cff1e5a7c 73
BartJanssens 0:785cff1e5a7c 74 return(s << '[' << m[0] << "\r\n" << setw(w) << m[1] << ']' << "\r\n");
BartJanssens 0:785cff1e5a7c 75 }
BartJanssens 0:785cff1e5a7c 76
BartJanssens 0:785cff1e5a7c 77 istream &operator >> (istream &s, Mat2 &m)
BartJanssens 0:785cff1e5a7c 78 {
BartJanssens 0:785cff1e5a7c 79 Mat2 result;
BartJanssens 0:785cff1e5a7c 80 Char c;
BartJanssens 0:785cff1e5a7c 81
BartJanssens 0:785cff1e5a7c 82 // Expected format: [[1 2] [3 4]]
BartJanssens 0:785cff1e5a7c 83 // Each vector is a row of the row matrix.
BartJanssens 0:785cff1e5a7c 84
BartJanssens 0:785cff1e5a7c 85 while (s >> c && isspace(c)) // ignore leading white space
BartJanssens 0:785cff1e5a7c 86 ;
BartJanssens 0:785cff1e5a7c 87
BartJanssens 0:785cff1e5a7c 88 if (c == '[')
BartJanssens 0:785cff1e5a7c 89 {
BartJanssens 0:785cff1e5a7c 90 s >> result[0] >> result[1];
BartJanssens 0:785cff1e5a7c 91
BartJanssens 0:785cff1e5a7c 92 if (!s)
BartJanssens 0:785cff1e5a7c 93 {
BartJanssens 0:785cff1e5a7c 94 cerr << "Expected number while reading matrix\n";
BartJanssens 0:785cff1e5a7c 95 return(s);
BartJanssens 0:785cff1e5a7c 96 }
BartJanssens 0:785cff1e5a7c 97
BartJanssens 0:785cff1e5a7c 98 while (s >> c && isspace(c))
BartJanssens 0:785cff1e5a7c 99 ;
BartJanssens 0:785cff1e5a7c 100
BartJanssens 0:785cff1e5a7c 101 if (c != ']')
BartJanssens 0:785cff1e5a7c 102 {
BartJanssens 0:785cff1e5a7c 103 s.clear(ios::failbit);
BartJanssens 0:785cff1e5a7c 104 cerr << "Expected ']' while reading matrix\n";
BartJanssens 0:785cff1e5a7c 105 return(s);
BartJanssens 0:785cff1e5a7c 106 }
BartJanssens 0:785cff1e5a7c 107 }
BartJanssens 0:785cff1e5a7c 108 else
BartJanssens 0:785cff1e5a7c 109 {
BartJanssens 0:785cff1e5a7c 110 s.clear(ios::failbit);
BartJanssens 0:785cff1e5a7c 111 cerr << "Expected '[' while reading matrix\n";
BartJanssens 0:785cff1e5a7c 112 return(s);
BartJanssens 0:785cff1e5a7c 113 }
BartJanssens 0:785cff1e5a7c 114
BartJanssens 0:785cff1e5a7c 115 m = result;
BartJanssens 0:785cff1e5a7c 116 return(s);
BartJanssens 0:785cff1e5a7c 117 }
BartJanssens 0:785cff1e5a7c 118 */
BartJanssens 0:785cff1e5a7c 119
BartJanssens 0:785cff1e5a7c 120
BartJanssens 0:785cff1e5a7c 121 Mat2 &Mat2::MakeRot(Real theta)
BartJanssens 0:785cff1e5a7c 122 {
BartJanssens 0:785cff1e5a7c 123 Real c, s;
BartJanssens 0:785cff1e5a7c 124
BartJanssens 0:785cff1e5a7c 125 SetReal(s, sin(theta));
BartJanssens 0:785cff1e5a7c 126 SetReal(c, cos(theta));
BartJanssens 0:785cff1e5a7c 127
BartJanssens 0:785cff1e5a7c 128 #ifdef VL_ROW_ORIENT
BartJanssens 0:785cff1e5a7c 129 row[0][0] = c; row[0][1] = s;
BartJanssens 0:785cff1e5a7c 130 row[1][0] = -s; row[1][1] = c;
BartJanssens 0:785cff1e5a7c 131 #else
BartJanssens 0:785cff1e5a7c 132 row[0][0] = c; row[0][1] = -s;
BartJanssens 0:785cff1e5a7c 133 row[1][0] = s; row[1][1] = c;
BartJanssens 0:785cff1e5a7c 134 #endif
BartJanssens 0:785cff1e5a7c 135
BartJanssens 0:785cff1e5a7c 136 return(SELF);
BartJanssens 0:785cff1e5a7c 137 }
BartJanssens 0:785cff1e5a7c 138
BartJanssens 0:785cff1e5a7c 139 Mat2 &Mat2::MakeScale(const Vec2 &s)
BartJanssens 0:785cff1e5a7c 140 {
BartJanssens 0:785cff1e5a7c 141 row[0][0] = s[0]; row[0][1] = vl_0;
BartJanssens 0:785cff1e5a7c 142 row[1][0] = vl_0; row[1][1] = s[1];
BartJanssens 0:785cff1e5a7c 143
BartJanssens 0:785cff1e5a7c 144 return(SELF);
BartJanssens 0:785cff1e5a7c 145 }
BartJanssens 0:785cff1e5a7c 146