|
@@ -204,7 +204,7 @@
|
204
|
204
|
* the case where the printer is making a vertical line that only crosses horizontal mesh lines.
|
205
|
205
|
*/
|
206
|
206
|
inline static float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) {
|
207
|
|
- if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 2) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) {
|
|
207
|
+ if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) {
|
208
|
208
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
209
|
209
|
if (DEBUGGING(LEVELING)) {
|
210
|
210
|
serialprintPGM( !WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) ? PSTR("x1l_i") : PSTR("yi") );
|
|
@@ -221,14 +221,16 @@
|
221
|
221
|
const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * (1.0 / (MESH_X_DIST)),
|
222
|
222
|
z1 = z_values[x1_i][yi];
|
223
|
223
|
|
224
|
|
- return z1 + xratio * (z_values[x1_i + 1][yi] - z1);
|
|
224
|
+ return z1 + xratio * (z_values[x1_i < GRID_MAX_POINTS_X - 1 ? x1_i + 1 : x1_i][yi] - z1); // Don't allow x1_i+1 to be past the end of the array
|
|
225
|
+ // If it is, it is clamped to the last element of the
|
|
226
|
+ // z_values[][] array and no correction is applied.
|
225
|
227
|
}
|
226
|
228
|
|
227
|
229
|
//
|
228
|
230
|
// See comments above for z_correction_for_x_on_horizontal_mesh_line
|
229
|
231
|
//
|
230
|
232
|
inline static float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) {
|
231
|
|
- if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 2)) {
|
|
233
|
+ if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) {
|
232
|
234
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
233
|
235
|
if (DEBUGGING(LEVELING)) {
|
234
|
236
|
serialprintPGM( !WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) ? PSTR("xi") : PSTR("yl_i") );
|
|
@@ -245,7 +247,9 @@
|
245
|
247
|
const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * (1.0 / (MESH_Y_DIST)),
|
246
|
248
|
z1 = z_values[xi][y1_i];
|
247
|
249
|
|
248
|
|
- return z1 + yratio * (z_values[xi][y1_i + 1] - z1);
|
|
250
|
+ return z1 + yratio * (z_values[xi][y1_i < GRID_MAX_POINTS_Y - 1 ? y1_i + 1 : y1_i] - z1); // Don't allow y1_i+1 to be past the end of the array
|
|
251
|
+ // If it is, it is clamped to the last element of the
|
|
252
|
+ // z_values[][] array and no correction is applied.
|
249
|
253
|
}
|
250
|
254
|
|
251
|
255
|
/**
|
|
@@ -258,7 +262,7 @@
|
258
|
262
|
const int8_t cx = get_cell_index_x(rx0),
|
259
|
263
|
cy = get_cell_index_y(ry0);
|
260
|
264
|
|
261
|
|
- if (!WITHIN(cx, 0, GRID_MAX_POINTS_X - 2) || !WITHIN(cy, 0, GRID_MAX_POINTS_Y - 2)) {
|
|
265
|
+ if (!WITHIN(cx, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(cy, 0, GRID_MAX_POINTS_Y - 1)) {
|
262
|
266
|
|
263
|
267
|
SERIAL_ECHOPAIR("? in get_z_correction(rx0=", rx0);
|
264
|
268
|
SERIAL_ECHOPAIR(", ry0=", ry0);
|
|
@@ -274,11 +278,11 @@
|
274
|
278
|
|
275
|
279
|
const float z1 = calc_z0(rx0,
|
276
|
280
|
mesh_index_to_xpos(cx), z_values[cx][cy],
|
277
|
|
- mesh_index_to_xpos(cx + 1), z_values[cx + 1][cy]);
|
|
281
|
+ mesh_index_to_xpos(cx + 1), z_values[cx < GRID_MAX_POINTS_X - 1 ? cx + 1 : cx][cy]);
|
278
|
282
|
|
279
|
283
|
const float z2 = calc_z0(rx0,
|
280
|
|
- mesh_index_to_xpos(cx), z_values[cx][cy + 1],
|
281
|
|
- mesh_index_to_xpos(cx + 1), z_values[cx + 1][cy + 1]);
|
|
284
|
+ mesh_index_to_xpos(cx), z_values[cx][cy < GRID_MAX_POINTS_Y - 1 ? cy + 1 : cy],
|
|
285
|
+ mesh_index_to_xpos(cx + 1), z_values[cx < GRID_MAX_POINTS_X - 1 ? cx + 1 : cx][cy<GRID_MAX_POINTS_Y - 1 ? cy + 1 : cy]);
|
282
|
286
|
|
283
|
287
|
float z0 = calc_z0(ry0,
|
284
|
288
|
mesh_index_to_ypos(cy), z1,
|