OrcaSlicer/src/libslic3r/GCode/PchipInterpolatorHelper.hpp
Ioannis Giannakas 529c44d8e3
Enhancement: Adaptive Pressure advance (#5609)
* Adaptive Pressure advance options setup

* Dynamic PA - PCHIP interpolator code and tests

* Integrate dynamic PA with slicing code - emit new PA values per speed change

* Link adaptive PA to role change instead of speed change

* Adaptive PA - Alpha 2

Reduce the frequency of requested PA changes by introducing a "state" variable.
Implement user toggle for adapting PA for external walls for overhangs

* Hide adaptive PA for overhangs

* Convert Adaptive PA to use volumetric flow model and start preparing for converting to Gcode post processor

* Converted Dynamic PA to a post processing filter. Reverted changes in GCode cpp and created tagging mechanism to allow filter to apply PA changes.

* Removed adaptive PA for overhangs

* Foundations for two dimensional adaptive PA based on acceleration and volumetric flow speed

* Minor code cleanup and updating of tooltips

* Renaming files for better clarity and generate classes documentation

* Update src/libslic3r/PrintConfig.cpp

Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com>

* Update src/libslic3r/PrintConfig.cpp

Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com>

* Update src/libslic3r/PrintConfig.cpp

Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com>

* Introduce average mm3_mm over the length of a multipath for adaptive PA

* Updates for multipath handling part 2

* Introduce average mm3_mm over the length of a multipath for adaptive PA

* Trigger PA evaluation more frequently to catch edge cases where speed changes across islands of the same feature type.

* Updates for multipath handling part 2

* Adaptive PA: Implement average flow estimation on loops

* Code formatting

* Fix adaptive PA not adapting for small disconnected external wall line segments.

* Updated to take max print speed of upcoming feature to calculate new PA value.

This is to resolve issue of incorrect PA value used when starting a new feature at an overhang.

* Code clean up

* Performance tuning

* Further performance tuning by reducing use of regex commands in the nested loops and fix bug preventing gcode line output

* Further performance tuning and tweaks to stop searching for max speed after the first travel move.

* Reduce debug information

* Updated debug info

* Fix an issue on seams on specific models when wipe before external perimeter was enabled. Also cleanup documentation and add new to-do's

* Prepare for adaptive PA for overhangs, fix wipe bug & clean up code and comments

* Initial commit for adapting PA when extruding fully overhanging perimeters

* Ignore wipe command when identifying current print speed

* Option to evaluate adaptive PA on overhang regions in preparation for Klipper experimental option testing

* Update to issue PA changes for varying flow conditions within the same feature

* Fix bug where adaptive PA was enabled erroneously for role changes and ignoring user's preference.

* Refactored some code

* More refactoring

* Some bug fixes and enabled comments only when verbose g-code is enabled

* Introduced dedicated PA option for bridges

* Code refactoring to optimise initialisation of PA processor (making it faster). Fix a bug where PA was not always set after a toolchange. Improve general error handling and robustness.

* Updates to adaptive PA tooltips

* Bridging PA check with Epsilon instead of 0.

* Adaptive PA: addressing comments

---------

Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com>
2024-07-28 22:52:08 +08:00

76 lines
2.6 KiB
C++

// PchipInterpolatorHelper.hpp
// OrcaSlicer
//
// Header file for the PchipInterpolatorHelper class, responsible for performing Piecewise Cubic Hermite Interpolating Polynomial (PCHIP) interpolation on given data points.
#ifndef PCHIPINTERPOLATORHELPER_HPP
#define PCHIPINTERPOLATORHELPER_HPP
#include <vector>
/**
* @class PchipInterpolatorHelper
* @brief A helper class to perform Piecewise Cubic Hermite Interpolating Polynomial (PCHIP) interpolation.
*/
class PchipInterpolatorHelper {
public:
/**
* @brief Default constructor.
*/
PchipInterpolatorHelper() = default;
/**
* @brief Constructs the PCHIP interpolator with given data points.
* @param x The x-coordinates of the data points.
* @param y The y-coordinates of the data points.
*/
PchipInterpolatorHelper(const std::vector<double>& x, const std::vector<double>& y);
/**
* @brief Sets the data points for the interpolator.
* @param x The x-coordinates of the data points.
* @param y The y-coordinates of the data points.
* @throw std::invalid_argument if x and y have different sizes or if they contain fewer than two points.
*/
void setData(const std::vector<double>& x, const std::vector<double>& y);
/**
* @brief Interpolates the value at a given point.
* @param xi The x-coordinate at which to interpolate.
* @return The interpolated y-coordinate.
*/
double interpolate(double xi) const;
private:
std::vector<double> x_; ///< The x-coordinates of the data points.
std::vector<double> y_; ///< The y-coordinates of the data points.
std::vector<double> h_; ///< The differences between successive x-coordinates.
std::vector<double> delta_; ///< The slopes of the segments between successive data points.
std::vector<double> d_; ///< The derivatives at the data points.
/**
* @brief Computes the PCHIP coefficients.
*/
void computePCHIP();
/**
* @brief Sorts the data points by x-coordinate.
*/
void sortData();
/**
* @brief Computes the difference between successive x-coordinates.
* @param i The index of the x-coordinate.
* @return The difference between x_[i+1] and x_[i].
*/
double h(int i) const { return x_[i+1] - x_[i]; }
/**
* @brief Computes the slope of the segment between successive data points.
* @param i The index of the segment.
* @return The slope of the segment between y_[i] and y_[i+1].
*/
double delta(int i) const { return (y_[i+1] - y_[i]) / h(i); }
};
#endif // PCHIPINTERPOLATORHELPER_HPP