11//
22// FILE: SparseMatrix.cpp
33// AUTHOR: Rob Tillaart
4- // VERSION: 0.1.2
4+ // VERSION: 0.1.3
55// DATE: 2022-07-12
66// PURPOSE: Arduino library for sparse matrices
77// URL: https://github.com/RobTillaart/SparseMatrix
1414// 0.1.2 2022-07-14 increase size to uint16_t
1515// add SPARSEMATRIX_MAX_SIZE
1616// improve documentation
17+ // 0.1.3 2022-07-16 add boundingBox(...)
18+ // fix #4 set() add()
19+
1720
1821
1922#include " SparseMatrix.h"
@@ -80,33 +83,13 @@ bool SparseMatrix::set(uint8_t x, uint8_t y, float value)
8083 // existing element
8184 if (pos > -1 )
8285 {
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);
9988 return true ;
10089 }
10190
10291 // 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);
11093}
11194
11295
@@ -117,29 +100,12 @@ bool SparseMatrix::add(uint8_t x, uint8_t y, float value)
117100 if (pos > -1 )
118101 {
119102 _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);
132104 return true ;
133105 }
134106
135107 // 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);
143109}
144110
145111
@@ -154,6 +120,24 @@ float SparseMatrix::get(uint8_t x, uint8_t y)
154120}
155121
156122
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+
157141// ////////////////////////////////////////////////////
158142//
159143// PRIVATE
@@ -172,6 +156,29 @@ int32_t SparseMatrix::findPos(uint8_t x, uint8_t y)
172156}
173157
174158
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+
175182
176183// -- END OF FILE --
177184
0 commit comments