Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Mat2.cpp@1:e25ff4b06ed2, 2016-01-05 (annotated)
- 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?
User | Revision | Line number | New 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 |