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.

Committer:
EricWieser
Date:
Mon Feb 13 22:19:58 2012 +0000
Revision:
0:1deae5ffe9ed
Child:
1:44819562ea31

        

Who changed what in which revision?

UserRevisionLine numberNew 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