#ifndef MATPLOTLIBPLOTTER_H #define MATPLOTLIBPLOTTER_H #include "Plotter.h" #include "matplotlibcpp.h" namespace plt = matplotlibcpp; /** * @brief Matplotlib-cpp implementation of the Plotter interface. */ class MatplotlibPlotter : public Plotter { public: virtual ~MatplotlibPlotter() = default; void plot2D(const std::vector& xData, const std::vector& yData, const std::string& title, const std::string& xLabel, const std::string& yLabel) override { plt::figure(); plt::plot(xData, yData); // Plot any queued markers for (const auto& marker : markers_) { plt::axvline(marker.first, 0.0, 1.0, {{"color", "red"}, {"linestyle", "--"}}); plt::text(marker.first, *std::max_element(yData.begin(), yData.end()), marker.second); } plt::title(title); plt::xlabel(xLabel); plt::ylabel(yLabel); plt::grid(true); plt::show(); // markers_.clear(); } void addMarker(double xValue, const std::string& label) override { markers_.emplace_back(xValue, label); } void plotPosVelAcc(const std::vector& time, const std::vector& altitude, const std::vector& velocity, const std::vector& acceleration) override { plt::figure(); plt::subplot(3, 1, 1); plt::plot(time, altitude); plt::title("Altitude vs Time"); plt::ylabel("Altitude (m)"); plt::grid(true); for (const auto& marker : markers_) { plt::axvline(marker.first, 0.0, 1.0, {{"color", "red"}, {"linestyle", "--"}}); plt::text(marker.first, *std::max_element(altitude.begin(), altitude.end()), marker.second); } plt::subplot(3, 1, 2); plt::plot(time, velocity); plt::title("Velocity vs Time"); plt::ylabel("Velocity (m/s)"); plt::grid(true); for (const auto& marker : markers_) { plt::axvline(marker.first, 0.0, 1.0, {{"color", "red"}, {"linestyle", "--"}}); plt::text(marker.first, *std::max_element(velocity.begin(), velocity.end()), marker.second); } plt::subplot(3, 1, 3); plt::plot(time, acceleration); plt::title("Acceleration vs Time"); plt::xlabel("Time (s)"); plt::ylabel("Acceleration (m/s2)"); plt::grid(true); for (const auto& marker : markers_) { plt::axvline(marker.first, 0.0, 1.0, {{"color", "red"}, {"linestyle", "--"}}); plt::text(marker.first, *std::max_element(acceleration.begin(), acceleration.end()), marker.second); } plt::tight_layout(); plt::show(); // markers_.clear(); } private: std::vector> markers_; }; #endif // MATPLOTLIBPLOTTER_H