Skip to content

Commit 66ca81f

Browse files
improve memory usage and simplify code
1 parent b1c03bc commit 66ca81f

File tree

1 file changed

+28
-64
lines changed

1 file changed

+28
-64
lines changed

cedargrove_waveviz.py

Lines changed: 28 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
https://circuitpython.org/downloads
2020
"""
2121

22+
from array import array
2223
import displayio
2324
import bitmaptools
2425

@@ -56,6 +57,7 @@ def __init__(
5657
self._origin = origin
5758
self._size = size
5859
self._scale = scale
60+
self._y_offset = self._size[1] // 2
5961

6062
self._palette = displayio.Palette(3)
6163
self._palette[1] = plot_color
@@ -93,85 +95,47 @@ def _plot_wave(self):
9395
determined from the extracted sample values."""
9496
samples = len(self._wave_table) # Samples in wave table
9597

96-
# Detect maximum value of extracted values and calculate scale factor
97-
max_sample_value = 0
98+
# Create and fill the polygon arrays
99+
x_points = array("h", [])
100+
y_points = array("h", [])
98101
for x in range(self._size[0]):
102+
x_points.append(x)
99103
table_idx = int(x * (samples / self._size[0]))
100-
max_sample_value = max(
101-
abs(min(max_sample_value, self._wave_table[table_idx])),
102-
abs(max(max_sample_value, self._wave_table[table_idx])),
103-
)
104-
scale_y = self._size[1] / max_sample_value / 2
104+
y_points.append(self._wave_table[table_idx])
105+
# Update the final point
106+
y_points[-1] = self._wave_table[-1]
105107

106-
self._prev_point = (0, 0) # (display x index, wave_table index)
108+
# Calculate the y-axis scale factor and adjust y values
109+
max_sample_value = max(y_points)
110+
scale_y = self._size[1] / max_sample_value / 2
111+
for y in range(self._size[0]):
112+
y_points[y] = self._y_offset + int(y_points[y] * scale_y)
107113

108-
for x in range(0, self._size[0]):
109-
table_idx = int(x * (samples / self._size[0]))
110-
self._next_point = (x, table_idx)
111-
112-
bitmaptools.draw_line(
113-
self._bmp,
114-
self._prev_point[0],
115-
(self._size[1] // 2)
116-
+ (-int(self._wave_table[self._prev_point[1]] * scale_y)),
117-
self._next_point[0],
118-
(self._size[1] // 2)
119-
+ (-int(self._wave_table[self._next_point[1]] * scale_y)),
120-
1,
121-
)
122-
123-
self._prev_point = self._next_point
124-
125-
# Always plot the final point
126-
bitmaptools.draw_line(
114+
# Draw the values as an open polygon
115+
bitmaptools.draw_polygon(
127116
self._bmp,
128-
self._prev_point[0],
129-
(self._size[1] // 2)
130-
+ (-int(self._wave_table[self._prev_point[1]] * scale_y)),
131-
self._next_point[0],
132-
(self._size[1] // 2) + (-int(self._wave_table[-1] * scale_y)),
117+
x_points,
118+
y_points,
133119
1,
120+
False,
134121
)
135122

136123
def _plot_grid(self):
137-
"""Plot the grid lines as a bitmap."""
138-
bitmaptools.draw_line(
139-
self._bmp,
140-
0,
141-
0,
142-
self._size[0] - 1,
143-
0,
144-
2,
145-
)
146-
bitmaptools.draw_line(
147-
self._bmp,
148-
self._size[0] - 1,
149-
0,
150-
self._size[0] - 1,
151-
self._size[1] - 1,
152-
2,
153-
)
154-
bitmaptools.draw_line(
124+
"""Plot the grid lines."""
125+
# Draw the outer box
126+
bitmaptools.draw_polygon(
155127
self._bmp,
156-
self._size[0] - 1,
157-
self._size[1] - 1,
158-
0,
159-
self._size[1] - 1,
160-
2,
161-
)
162-
bitmaptools.draw_line(
163-
self._bmp,
164-
0,
165-
self._size[1] - 1,
166-
0,
167-
0,
128+
array("h", [0, self._size[0] - 1, self._size[0] - 1, 0]),
129+
array("h", [0, 0, self._size[1] - 1, self._size[1] - 1]),
168130
2,
169131
)
132+
133+
# Draw x-axis line
170134
bitmaptools.draw_line(
171135
self._bmp,
172136
0,
173-
self._size[1] // 2,
137+
self._y_offset,
174138
self._size[0],
175-
self._size[1] // 2,
139+
self._y_offset,
176140
2,
177141
)

0 commit comments

Comments
 (0)