#include "viz/scatter_3d.h" #include "imgui.h" #include "implot3d.h" namespace fn { void scatter_3d(const char* title, const Scatter3DConfig& cfg) { if (!cfg.xs || !cfg.ys || !cfg.zs || cfg.n < 1) { ImGui::BeginGroup(); ImGui::TextDisabled("%s", title ? title : "##scatter_3d"); ImGui::TextWrapped("scatter_3d: necesita xs, ys, zs != nullptr y n >= 1 (recibido n=%d)", cfg.n); ImGui::EndGroup(); return; } if (ImPlot3D::BeginPlot(title, cfg.size)) { ImPlot3D::SetupAxes("x", "y", "z"); // ImPlot3DSpec::MarkerSizes / MarkerFillColors esperan punteros no // const; los arrays de cfg vienen como const*. Como ImPlot3D solo los // lee, hacemos un const_cast acotado a esta llamada. ImPlot3DSpec spec; if (cfg.sizes) spec.MarkerSizes = const_cast(cfg.sizes); if (cfg.colors) spec.MarkerFillColors = const_cast(cfg.colors); ImPlot3D::PlotScatter("##points", cfg.xs, cfg.ys, cfg.zs, cfg.n, spec); ImPlot3D::EndPlot(); } } } // namespace fn