|
19 | 19 | https://circuitpython.org/downloads |
20 | 20 | """ |
21 | 21 |
|
| 22 | +from array import array |
22 | 23 | import displayio |
23 | 24 | import bitmaptools |
24 | 25 |
|
@@ -56,6 +57,7 @@ def __init__( |
56 | 57 | self._origin = origin |
57 | 58 | self._size = size |
58 | 59 | self._scale = scale |
| 60 | + self._y_offset = self._size[1] // 2 |
59 | 61 |
|
60 | 62 | self._palette = displayio.Palette(3) |
61 | 63 | self._palette[1] = plot_color |
@@ -93,85 +95,47 @@ def _plot_wave(self): |
93 | 95 | determined from the extracted sample values.""" |
94 | 96 | samples = len(self._wave_table) # Samples in wave table |
95 | 97 |
|
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", []) |
98 | 101 | for x in range(self._size[0]): |
| 102 | + x_points.append(x) |
99 | 103 | 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] |
105 | 107 |
|
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) |
107 | 113 |
|
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( |
127 | 116 | 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, |
133 | 119 | 1, |
| 120 | + False, |
134 | 121 | ) |
135 | 122 |
|
136 | 123 | 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( |
155 | 127 | 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]), |
168 | 130 | 2, |
169 | 131 | ) |
| 132 | + |
| 133 | + # Draw x-axis line |
170 | 134 | bitmaptools.draw_line( |
171 | 135 | self._bmp, |
172 | 136 | 0, |
173 | | - self._size[1] // 2, |
| 137 | + self._y_offset, |
174 | 138 | self._size[0], |
175 | | - self._size[1] // 2, |
| 139 | + self._y_offset, |
176 | 140 | 2, |
177 | 141 | ) |
0 commit comments