A library to manipulate 2D arrays, and output them to an LED Dot Matrix Display. The display must be wired up using a shift register combined with a nor latch.
Matrix.h@0:1deae5ffe9ed, 2012-02-13 (annotated)
- Committer:
- EricWieser
- Date:
- Mon Feb 13 22:19:58 2012 +0000
- Revision:
- 0:1deae5ffe9ed
- Child:
- 1:44819562ea31
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EricWieser | 0:1deae5ffe9ed | 1 | #include <cassert> |
EricWieser | 0:1deae5ffe9ed | 2 | #include "Locations.h" |
EricWieser | 0:1deae5ffe9ed | 3 | |
EricWieser | 0:1deae5ffe9ed | 4 | #ifndef Matrix_H |
EricWieser | 0:1deae5ffe9ed | 5 | #define Matrix_H |
EricWieser | 0:1deae5ffe9ed | 6 | template <class T> class Matrix { |
EricWieser | 0:1deae5ffe9ed | 7 | private: |
EricWieser | 0:1deae5ffe9ed | 8 | T* _data; |
EricWieser | 0:1deae5ffe9ed | 9 | int _width; |
EricWieser | 0:1deae5ffe9ed | 10 | int _height; |
EricWieser | 0:1deae5ffe9ed | 11 | |
EricWieser | 0:1deae5ffe9ed | 12 | T& item(int x, int y) const{ |
EricWieser | 0:1deae5ffe9ed | 13 | return _data[y*_width + x]; |
EricWieser | 0:1deae5ffe9ed | 14 | } |
EricWieser | 0:1deae5ffe9ed | 15 | |
EricWieser | 0:1deae5ffe9ed | 16 | void init() { |
EricWieser | 0:1deae5ffe9ed | 17 | _data = new T[_width*_height]; |
EricWieser | 0:1deae5ffe9ed | 18 | } |
EricWieser | 0:1deae5ffe9ed | 19 | public: |
EricWieser | 0:1deae5ffe9ed | 20 | Matrix(int width, int height) : _width(width), _height(height) { |
EricWieser | 0:1deae5ffe9ed | 21 | init(); |
EricWieser | 0:1deae5ffe9ed | 22 | } |
EricWieser | 0:1deae5ffe9ed | 23 | |
EricWieser | 0:1deae5ffe9ed | 24 | template <int w, int h> |
EricWieser | 0:1deae5ffe9ed | 25 | Matrix(T (&array)[h][w]) : _width(w), _height(h) { |
EricWieser | 0:1deae5ffe9ed | 26 | init(); |
EricWieser | 0:1deae5ffe9ed | 27 | |
EricWieser | 0:1deae5ffe9ed | 28 | for(int x = 0; x < w; x++) { |
EricWieser | 0:1deae5ffe9ed | 29 | for(int y = 0; y < h; y++) { |
EricWieser | 0:1deae5ffe9ed | 30 | item(x, y) = array[y][x]; |
EricWieser | 0:1deae5ffe9ed | 31 | } |
EricWieser | 0:1deae5ffe9ed | 32 | } |
EricWieser | 0:1deae5ffe9ed | 33 | } |
EricWieser | 0:1deae5ffe9ed | 34 | |
EricWieser | 0:1deae5ffe9ed | 35 | Matrix(const Matrix<T> &that) : _width(that._width), _height(that._height) { |
EricWieser | 0:1deae5ffe9ed | 36 | init(); |
EricWieser | 0:1deae5ffe9ed | 37 | |
EricWieser | 0:1deae5ffe9ed | 38 | for(int i = 0; i < _width; i++) { |
EricWieser | 0:1deae5ffe9ed | 39 | for(int j = 0; j < _height; j++) { |
EricWieser | 0:1deae5ffe9ed | 40 | this->item(i, j) = that.item(i, j); |
EricWieser | 0:1deae5ffe9ed | 41 | } |
EricWieser | 0:1deae5ffe9ed | 42 | } |
EricWieser | 0:1deae5ffe9ed | 43 | } |
EricWieser | 0:1deae5ffe9ed | 44 | |
EricWieser | 0:1deae5ffe9ed | 45 | ~Matrix() { |
EricWieser | 0:1deae5ffe9ed | 46 | delete [] _data; |
EricWieser | 0:1deae5ffe9ed | 47 | } |
EricWieser | 0:1deae5ffe9ed | 48 | |
EricWieser | 0:1deae5ffe9ed | 49 | int getWidth() const { return _width; } |
EricWieser | 0:1deae5ffe9ed | 50 | int getHeight() const { return _height; } |
EricWieser | 0:1deae5ffe9ed | 51 | |
EricWieser | 0:1deae5ffe9ed | 52 | bool contains(int x, int y) const { |
EricWieser | 0:1deae5ffe9ed | 53 | return x >= 0 && x < _width && y >= 0 && y < _height; |
EricWieser | 0:1deae5ffe9ed | 54 | } |
EricWieser | 0:1deae5ffe9ed | 55 | bool containsRect(int x, int y, int w, int h) const { |
EricWieser | 0:1deae5ffe9ed | 56 | return x >= 0 && x + w <= _width && y >= 0 && y + h <= _height; |
EricWieser | 0:1deae5ffe9ed | 57 | } |
EricWieser | 0:1deae5ffe9ed | 58 | |
EricWieser | 0:1deae5ffe9ed | 59 | T& operator() (const int x, const int y) { |
EricWieser | 0:1deae5ffe9ed | 60 | assert(contains(x, y)); |
EricWieser | 0:1deae5ffe9ed | 61 | return item(x, y); |
EricWieser | 0:1deae5ffe9ed | 62 | } |
EricWieser | 0:1deae5ffe9ed | 63 | |
EricWieser | 0:1deae5ffe9ed | 64 | |
EricWieser | 0:1deae5ffe9ed | 65 | const T& operator() (const int x, const int y) const { |
EricWieser | 0:1deae5ffe9ed | 66 | assert(contains(x, y)); |
EricWieser | 0:1deae5ffe9ed | 67 | return item(x, y); |
EricWieser | 0:1deae5ffe9ed | 68 | } |
EricWieser | 0:1deae5ffe9ed | 69 | |
EricWieser | 0:1deae5ffe9ed | 70 | T& operator[] (const IntLocation p) { |
EricWieser | 0:1deae5ffe9ed | 71 | return (*this)(p.x, p.y); |
EricWieser | 0:1deae5ffe9ed | 72 | } |
EricWieser | 0:1deae5ffe9ed | 73 | const T& operator[] (const IntLocation p) const { |
EricWieser | 0:1deae5ffe9ed | 74 | return (*this)(p.x, p.y); |
EricWieser | 0:1deae5ffe9ed | 75 | } |
EricWieser | 0:1deae5ffe9ed | 76 | |
EricWieser | 0:1deae5ffe9ed | 77 | |
EricWieser | 0:1deae5ffe9ed | 78 | Matrix<T> slice(int x, int y, int w, int h) const { |
EricWieser | 0:1deae5ffe9ed | 79 | assert(containsRect(x, y, w, h)); |
EricWieser | 0:1deae5ffe9ed | 80 | |
EricWieser | 0:1deae5ffe9ed | 81 | Matrix<T> b = Matrix<T>(w, h); |
EricWieser | 0:1deae5ffe9ed | 82 | |
EricWieser | 0:1deae5ffe9ed | 83 | for(int i = 0; i < w; i++) { |
EricWieser | 0:1deae5ffe9ed | 84 | for(int j = 0; j < h; j++) { |
EricWieser | 0:1deae5ffe9ed | 85 | b.item(i, j) = this->item(x + i, y + j); |
EricWieser | 0:1deae5ffe9ed | 86 | } |
EricWieser | 0:1deae5ffe9ed | 87 | } |
EricWieser | 0:1deae5ffe9ed | 88 | return b; |
EricWieser | 0:1deae5ffe9ed | 89 | } |
EricWieser | 0:1deae5ffe9ed | 90 | |
EricWieser | 0:1deae5ffe9ed | 91 | |
EricWieser | 0:1deae5ffe9ed | 92 | void overlay(const Matrix<T> &that, int x, int y) { |
EricWieser | 0:1deae5ffe9ed | 93 | assert(containsRect(x, y, that._width, that._height)); |
EricWieser | 0:1deae5ffe9ed | 94 | |
EricWieser | 0:1deae5ffe9ed | 95 | for(int i = 0; i < that._width; i++) { |
EricWieser | 0:1deae5ffe9ed | 96 | for(int j = 0; j < that._height; j++) { |
EricWieser | 0:1deae5ffe9ed | 97 | this->item(i, j) = that.item(x + i, y + j); |
EricWieser | 0:1deae5ffe9ed | 98 | } |
EricWieser | 0:1deae5ffe9ed | 99 | } |
EricWieser | 0:1deae5ffe9ed | 100 | } |
EricWieser | 0:1deae5ffe9ed | 101 | |
EricWieser | 0:1deae5ffe9ed | 102 | void overlay(const Matrix<T> &that, int sx, int sy, int w, int h, int dx, int dy) { |
EricWieser | 0:1deae5ffe9ed | 103 | assert(containsRect(dx, dy, w, h) && that.containsRect(sx, sy, w, h)); |
EricWieser | 0:1deae5ffe9ed | 104 | |
EricWieser | 0:1deae5ffe9ed | 105 | for(int i = 0; i < w; i++) { |
EricWieser | 0:1deae5ffe9ed | 106 | for(int j = 0; j < h; j++) { |
EricWieser | 0:1deae5ffe9ed | 107 | this->item(dx + i, dy + j) = that.item(sx + i, sy + j); |
EricWieser | 0:1deae5ffe9ed | 108 | } |
EricWieser | 0:1deae5ffe9ed | 109 | } |
EricWieser | 0:1deae5ffe9ed | 110 | } |
EricWieser | 0:1deae5ffe9ed | 111 | |
EricWieser | 0:1deae5ffe9ed | 112 | T* column(int x) const { |
EricWieser | 0:1deae5ffe9ed | 113 | assert(x >= 0 && x <= _width); |
EricWieser | 0:1deae5ffe9ed | 114 | T* col = new T[_height]; |
EricWieser | 0:1deae5ffe9ed | 115 | for(int j = 0; j < _height; j++) { |
EricWieser | 0:1deae5ffe9ed | 116 | col[j] = this->item(x, j); |
EricWieser | 0:1deae5ffe9ed | 117 | } |
EricWieser | 0:1deae5ffe9ed | 118 | return col; |
EricWieser | 0:1deae5ffe9ed | 119 | } |
EricWieser | 0:1deae5ffe9ed | 120 | T* row(int y) const { |
EricWieser | 0:1deae5ffe9ed | 121 | assert(y >= 0 && y <= _height); |
EricWieser | 0:1deae5ffe9ed | 122 | T* row = new T[_width]; |
EricWieser | 0:1deae5ffe9ed | 123 | for(int i = 0; i < _width; i++) { |
EricWieser | 0:1deae5ffe9ed | 124 | row[i] = this->item(i, y); |
EricWieser | 0:1deae5ffe9ed | 125 | } |
EricWieser | 0:1deae5ffe9ed | 126 | return row; |
EricWieser | 0:1deae5ffe9ed | 127 | } |
EricWieser | 0:1deae5ffe9ed | 128 | |
EricWieser | 0:1deae5ffe9ed | 129 | void clear() { |
EricWieser | 0:1deae5ffe9ed | 130 | for(int x = 0; x < _width; x++) |
EricWieser | 0:1deae5ffe9ed | 131 | for(int y = 0; y < _width; y++) |
EricWieser | 0:1deae5ffe9ed | 132 | (*this)(x, y) = T(); |
EricWieser | 0:1deae5ffe9ed | 133 | } |
EricWieser | 0:1deae5ffe9ed | 134 | }; |
EricWieser | 0:1deae5ffe9ed | 135 | #endif |