From a76dfc6254d866506bca3487ced280335af3d0d9 Mon Sep 17 00:00:00 2001 From: kreso-t Date: Mon, 17 Sep 2018 00:26:54 +0200 Subject: [PATCH] Path: Adaptive - small enhancement - improved handling in spiky corners --- src/Mod/Path/libarea/Adaptive.cpp | 49 +++++++++++++++++++------------ src/Mod/Path/libarea/Adaptive.hpp | 5 ++-- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/Mod/Path/libarea/Adaptive.cpp b/src/Mod/Path/libarea/Adaptive.cpp index 8e9208ad6e..ca7b393c8a 100644 --- a/src/Mod/Path/libarea/Adaptive.cpp +++ b/src/Mod/Path/libarea/Adaptive.cpp @@ -1654,6 +1654,7 @@ std::list Adaptive2d::Execute(const DPaths &stockPaths, const DP scaleFactor = 500; toolRadiusScaled = long(toolDiameter * scaleFactor / 2); + stepOverScaled = toolRadiusScaled * stepOverFactor; bbox_size = long(toolDiameter * scaleFactor); progressCallback = &progressCallbackFn; lastProgressTime = clock(); @@ -1760,7 +1761,7 @@ std::list Adaptive2d::Execute(const DPaths &stockPaths, const DP clipof.Clear(); clipof.AddPaths(inputPaths, JoinType::jtRound, EndType::etClosedPolygon); Paths paths; - clipof.Execute(paths, -toolRadiusScaled - finishPassOffsetScaled); + clipof.Execute(paths, -toolRadiusScaled - finishPassOffsetScaled -0.15*toolRadiusScaled/2); for (const auto ¤t : paths) { int nesting = getPathNestingLevel(current, paths); @@ -1776,6 +1777,12 @@ std::list Adaptive2d::Execute(const DPaths &stockPaths, const DP // calc bounding paths - i.e. area that must be cleared inside // it's not the same as input paths due to filtering (nesting logic) + + clipof.Clear(); + clipof.AddPaths(toolBoundPaths, JoinType::jtRound, EndType::etClosedPolygon); + clipof.Execute(toolBoundPaths, 0.15*toolRadiusScaled/2); + + Paths boundPaths; clipof.Clear(); clipof.AddPaths(toolBoundPaths, JoinType::jtRound, EndType::etClosedPolygon); @@ -1826,6 +1833,7 @@ std::list Adaptive2d::Execute(const DPaths &stockPaths, const DP clipof.Clear(); clipof.AddPaths(boundPaths, JoinType::jtRound, EndType::etClosedPolygon); clipof.Execute(toolBoundPaths, -toolRadiusScaled - finishPassOffsetScaled); + ProcessPolyNode(boundPaths, toolBoundPaths); } } @@ -2044,7 +2052,7 @@ bool Adaptive2d::IsAllowedToCutTrough(const IntPoint &p1, const IntPoint &p2, Cl { Clipper clip; double distance = sqrt(DistanceSqrd(p1, p2)); - double stepSize = min(0.5 * toolRadiusScaled * stepOverFactor, 8 * RESOLUTION_FACTOR); + double stepSize = min(0.5 * stepOverScaled, 8 * RESOLUTION_FACTOR); if (distance < stepSize / 2) { // not significant cut Perf_IsAllowedToCutTrough.Stop(); @@ -2108,7 +2116,7 @@ bool Adaptive2d::ResolveLinkPath(const IntPoint &startPoint, const IntPoint &end if (limit < 20) limit = 20; - double clearence = toolRadiusScaled * stepOverFactor / 2; + double clearence = stepOverScaled / 2; double offClearence = 2 * clearence + 1; if (2 * offClearence > directDistance) return false; @@ -2237,8 +2245,8 @@ bool Adaptive2d::MakeLeadPath(bool leadIn, const IntPoint &startPoint, const Dou IntPoint currentPoint = startPoint; DoublePoint targetDir = DirectionV(currentPoint, beaconPoint); double distanceToBeacon = sqrt(DistanceSqrd(startPoint, beaconPoint)); - double stepSize = 0.2 * toolRadiusScaled * stepOverFactor + 1; - double maxPathLen = toolRadiusScaled * stepOverFactor; + double stepSize = 0.2 * stepOverScaled + 1; + double maxPathLen = stepOverScaled; DoublePoint nextDir = startDir; IntPoint nextPoint = IntPoint(currentPoint.X + nextDir.X * stepSize, currentPoint.Y + nextDir.Y * stepSize); Path checkPath; @@ -2324,12 +2332,18 @@ void Adaptive2d::AppendToolPath(TPaths &progressPaths, AdaptiveOutput &output, double clpParameter; IntPoint clp; - double beaconOffset = toolRadiusScaled * stepOverFactor; + double beaconOffset = stepOverScaled; if (beaconOffset > linkDistance) { beaconOffset = linkDistance; } + double pathLen =PathLength(passToolPath); + if (beaconOffset > pathLen) + { + beaconOffset = pathLen; + } + DistancePointToPathsSqrd(toolBoundPaths, startPoint, clp, clpPathIndex, clpSegmentIndex, clpParameter); DoublePoint startDir = GetPathDirectionV(toolBoundPaths[clpPathIndex], clpSegmentIndex); @@ -2640,6 +2654,7 @@ void Adaptive2d::ProcessPolyNode(Paths boundPaths, Paths toolBoundPaths) size_t clpPathIndex; size_t clpSegmentIndex; double clpParamter; + double passLength=0; clearedBeforePass.SetClearedPaths(cleared.GetCleared()); /******************************* * LOOP - POINTS @@ -2741,11 +2756,14 @@ void Adaptive2d::ProcessPolyNode(Paths boundPaths, Paths toolBoundPaths) Perf_PointIterations.Stop(); // approach end boundary tangentially - double relDistToBoundary = distanceToBoundary / (toolRadiusScaled * stepOverFactor); - if (relDistToBoundary <= 1.0 && distBoundaryPointToEngage > toolRadiusScaled * stepOverFactor) + + double relDistToBoundary = 4*distanceToBoundary / stepOverScaled; + if (relDistToBoundary <= 1.0 + && passLength > 2*stepOverFactor + && distanceToEngage > 2*stepOverScaled + && distBoundaryPointToEngage > 2*stepOverScaled) { - double wb = (1 - relDistToBoundary); - //double w=(0.8*(1-exp(-4*distanceToBoundary/toolRadiusScaled)) + 0.2); + double wb = 1-relDistToBoundary; newToolDir = DoublePoint(newToolDir.X + wb * boundaryDir.X, newToolDir.Y + wb * boundaryDir.Y); NormalizeV(newToolDir); newToolPos = IntPoint(long(toolPos.X + newToolDir.X * stepScaled), long(toolPos.Y + newToolDir.Y * stepScaled)); @@ -2783,14 +2801,6 @@ void Adaptive2d::ProcessPolyNode(Paths boundPaths, Paths toolBoundPaths) if (area > stepScaled * optimalCutAreaPD && areaPD > 2 * optimalCutAreaPD) { // safety condition over_cut_count++; - // #ifdef DEV_MODE - // cout<<"Break: over cut @" << point_index << "(" << double(toolPos.X)/scaleFactor << ","<< double(toolPos.Y)/scaleFactor << ")" - // << " iter:" << iteration << " @bound:" << reachedBoundary << endl; - // #endif - // ClearScreenFn(); - // DrawCircle(toolPos,toolRadiusScaled,0); - // DrawCircle(newToolPos,toolRadiusScaled,1); - // DrawPaths(cleared,22); break; } @@ -2829,6 +2839,7 @@ void Adaptive2d::ProcessPolyNode(Paths boundPaths, Paths toolBoundPaths) } passToolPath.push_back(newToolPos); perf_total_len += stepScaled; + passLength+=stepScaled; toolPos = newToolPos; // append to progress info paths @@ -2888,7 +2899,7 @@ void Adaptive2d::ProcessPolyNode(Paths boundPaths, Paths toolBoundPaths) else { //double moveDistance = ENGAGE_SCAN_DISTANCE_FACTOR * RESOLUTION_FACTOR * 32 * stepOverFactor; - double moveDistance = ENGAGE_SCAN_DISTANCE_FACTOR * toolRadiusScaled * stepOverFactor * refinement_factor; + double moveDistance = ENGAGE_SCAN_DISTANCE_FACTOR * stepOverScaled * refinement_factor; if (!engage.nextEngagePoint(this, cleared, moveDistance, ENGAGE_AREA_THR_FACTOR * optimalCutAreaPD * RESOLUTION_FACTOR, diff --git a/src/Mod/Path/libarea/Adaptive.hpp b/src/Mod/Path/libarea/Adaptive.hpp index 90e94370c9..88cde1caa4 100644 --- a/src/Mod/Path/libarea/Adaptive.hpp +++ b/src/Mod/Path/libarea/Adaptive.hpp @@ -115,6 +115,7 @@ class Adaptive2d Paths stockInputPaths; int polyTreeNestingLimit = 0; double scaleFactor = 100; + double stepOverScaled = 1; long toolRadiusScaled = 10; long finishPassOffsetScaled = 0; long helixRampRadiusScaled = 0; @@ -159,14 +160,14 @@ class Adaptive2d const size_t ANGLE_HISTORY_POINTS = 3; // used for angle prediction const int DIRECTION_SMOOTHING_BUFLEN = 3; // gyro points - used for angle smoothing - const double ENGAGE_AREA_THR_FACTOR = 0.2; // influences minimal engage area (factor relation to optimal) + const double ENGAGE_AREA_THR_FACTOR = 0.1; // influences minimal engage area (factor relation to optimal) const double ENGAGE_SCAN_DISTANCE_FACTOR = 0.5; // influences the engage scan/stepping distance const double CLEAN_PATH_TOLERANCE = 0.5; const double FINISHING_CLEAN_PATH_TOLERANCE = 0.1; // used for filtering out of insignificant cuts: - const double MIN_CUT_AREA_FACTOR = 0.1; // influences filtering of cuts that with cumulative area below threshold, reasonable value is between 0.1 and 1 + const double MIN_CUT_AREA_FACTOR = 0.2; // influences filtering of cuts that with cumulative area below threshold, reasonable value is between 0.1 and 1 const long PASSES_LIMIT = __LONG_MAX__; // limit used while debugging const long POINTS_PER_PASS_LIMIT = __LONG_MAX__; // limit used while debugging