@@ -470,17 +470,27 @@ static bool isSameSide(float const v0[3], float const v1[3], float const v2[3],
470
470
return dot0*dot1 > 0 .0F ;
471
471
}
472
472
473
- static bool isInsideTetrahedron (float const point[3 ], float const tetrahedron[4 ][3 ]){
474
- return isSameSide (tetrahedron[0 ], tetrahedron[1 ], tetrahedron[2 ], tetrahedron[3 ], point) &&
475
- isSameSide (tetrahedron[2 ], tetrahedron[1 ], tetrahedron[3 ], tetrahedron[0 ], point) &&
476
- isSameSide (tetrahedron[2 ], tetrahedron[3 ], tetrahedron[0 ], tetrahedron[1 ], point) &&
477
- isSameSide (tetrahedron[0 ], tetrahedron[3 ], tetrahedron[1 ], tetrahedron[2 ], point);
478
- }
479
-
473
+ // For each triangle side in a pseudo-pyramid, check if the point is inside the pyramid (Except for the base)
474
+ // Also check that any point below the line between two exterior anchors (all anchors are exterior except for the last one)
475
+ // is in the "inside part" all the way down to min_Z, however low it may be.
476
+ // To further limit the movements in the X and Y axes one can simply set a smaller print radius.
480
477
bool HangprinterKinematics::IsReachable (float axesCoords[MaxAxes], AxesBitmap axes) const noexcept /* override*/
481
478
{
482
479
float const coords[3 ] = {axesCoords[X_AXIS], axesCoords[Y_AXIS], axesCoords[Z_AXIS]};
483
- return isInsideTetrahedron (coords, anchors);
480
+ bool reachable = true ;
481
+
482
+ // Check all the planes defined by triangle sides in the pyramid
483
+ for (size_t i = 0 ; reachable && i < HANGPRINTER_AXES - 1 ; ++i) {
484
+ reachable = reachable && isSameSide (anchors[i], anchors[(i+1 ) % (HANGPRINTER_AXES - 1 )], anchors[HANGPRINTER_AXES - 1 ], anchors[(i+2 ) % (HANGPRINTER_AXES - 1 )], coords);
485
+ }
486
+
487
+ // For each side of the base, check the plane formed by side and another point bellow them in z.
488
+ for (size_t i = 0 ; reachable && i < HANGPRINTER_AXES - 1 ; ++i) {
489
+ float const lower_point[3 ] = {anchors[i][0 ], anchors[i][1 ], anchors[i][2 ] - 1 };
490
+ reachable = reachable && isSameSide (anchors[i], anchors[(i+1 ) % (HANGPRINTER_AXES - 1 )], lower_point, anchors[(i+2 ) % (HANGPRINTER_AXES - 1 )], coords);
491
+ }
492
+
493
+ return reachable;
484
494
}
485
495
486
496
// Limit the Cartesian position that the user wants to move to returning true if we adjusted the position
0 commit comments