1
1
//
2
2
// FILE: SparseMatrix.cpp
3
3
// AUTHOR: Rob Tillaart
4
- // VERSION: 0.1.2
4
+ // VERSION: 0.1.3
5
5
// DATE: 2022-07-12
6
6
// PURPOSE: Arduino library for sparse matrices
7
7
// URL: https://github.com/RobTillaart/SparseMatrix
14
14
// 0.1.2 2022-07-14 increase size to uint16_t
15
15
// add SPARSEMATRIX_MAX_SIZE
16
16
// improve documentation
17
+ // 0.1.3 2022-07-16 add boundingBox(...)
18
+ // fix #4 set() add()
19
+
17
20
18
21
19
22
#include " SparseMatrix.h"
@@ -80,33 +83,13 @@ bool SparseMatrix::set(uint8_t x, uint8_t y, float value)
80
83
// existing element
81
84
if (pos > -1 )
82
85
{
83
- if (value != 0.0 )
84
- {
85
- _value[pos] = value;
86
- }
87
- else
88
- {
89
- _count--;
90
- // move last element
91
- // efficiency is not a requirement yet.
92
- if (_count > 0 )
93
- {
94
- _x[pos] = _x[_count];
95
- _y[pos] = _y[_count];
96
- _value[pos] = _value[_count];
97
- }
98
- }
86
+ _value[pos] = value;
87
+ if (_value[pos] == 0.0 ) removeElement (pos);
99
88
return true ;
100
89
}
101
90
102
91
// does not exist => new element ?
103
- if (value == 0 ) return true ;
104
- if (_count >= _size) return false ;
105
- _x[_count] = x;
106
- _y[_count] = y;
107
- _value[_count] = value;
108
- _count++;
109
- return true ;
92
+ return newElement (x, y, value);
110
93
}
111
94
112
95
@@ -117,29 +100,12 @@ bool SparseMatrix::add(uint8_t x, uint8_t y, float value)
117
100
if (pos > -1 )
118
101
{
119
102
_value[pos] += value;
120
- if (_value[pos] == 0.0 )
121
- {
122
- _count--;
123
- // move last element
124
- // efficiency is not a requirement yet.
125
- if (_count > 0 )
126
- {
127
- _x[pos] = _x[_count];
128
- _y[pos] = _y[_count];
129
- _value[pos] = _value[_count];
130
- }
131
- }
103
+ if (_value[pos] == 0.0 ) removeElement (pos);
132
104
return true ;
133
105
}
134
106
135
107
// does not exist => new element ?
136
- if (value == 0 ) return true ;
137
- if (_count >= _size) return false ;
138
- _x[_count] = x;
139
- _y[_count] = y;
140
- _value[_count] = value;
141
- _count++;
142
- return true ;
108
+ return newElement (x, y, value);
143
109
}
144
110
145
111
@@ -154,6 +120,24 @@ float SparseMatrix::get(uint8_t x, uint8_t y)
154
120
}
155
121
156
122
123
+ void SparseMatrix::boundingBox (uint8_t &minX, uint8_t &maxX, uint8_t &minY, uint8_t &maxY)
124
+ {
125
+ uint8_t _minx = 255 , _maxx = 0 ,
126
+ _miny = 255 , _maxy = 0 ;
127
+ for (uint16_t i = 0 ; i < _count; i++)
128
+ {
129
+ if (_x[i] < _minx) _minx = _x[i];
130
+ if (_x[i] > _maxx) _maxx = _x[i];
131
+ if (_y[i] < _miny) _miny = _y[i];
132
+ if (_y[i] > _maxy) _maxy = _y[i];
133
+ }
134
+ minX = _minx;
135
+ maxX = _maxx;
136
+ minY = _miny;
137
+ maxY = _maxy;
138
+ }
139
+
140
+
157
141
// ////////////////////////////////////////////////////
158
142
//
159
143
// PRIVATE
@@ -172,6 +156,29 @@ int32_t SparseMatrix::findPos(uint8_t x, uint8_t y)
172
156
}
173
157
174
158
159
+ void SparseMatrix::removeElement (uint16_t pos)
160
+ {
161
+ _count--;
162
+ // move last element
163
+ // efficiency (keep sorted) is no requirement.
164
+ if (pos == _count) return ;
165
+ _x[pos] = _x[_count];
166
+ _y[pos] = _y[_count];
167
+ _value[pos] = _value[_count];
168
+ }
169
+
170
+
171
+ bool SparseMatrix::newElement (uint8_t x, uint8_t y, float value)
172
+ {
173
+ if (value == 0.0 ) return true ;
174
+ if (_count >= _size) return false ;
175
+ _x[_count] = x;
176
+ _y[_count] = y;
177
+ _value[_count] = value;
178
+ _count++;
179
+ return true ;
180
+ }
181
+
175
182
176
183
// -- END OF FILE --
177
184
0 commit comments