7eef2544ab
Funciones C++/ImGui para dashboards (grid, panel, docking, sidebar, tabs), visualizaciones (candlestick, gauge, histogram, pie, sparkline, heatmap, scatter, line, bar, surface3d, kpi, table), grafos (force layout, renderer, viewport, spatial hash, types) y utilidades (time series buffer, tracy zones, memory/fps overlay, plot theme). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
77 lines
2.6 KiB
C++
77 lines
2.6 KiB
C++
#include "viz/sparkline.h"
|
|
#include "imgui.h"
|
|
|
|
void sparkline(const char* id, const float* values, int count, ImVec4 color,
|
|
float width, float height) {
|
|
if (count <= 0) return;
|
|
|
|
ImGui::PushID(id);
|
|
|
|
ImVec2 pos = ImGui::GetCursorScreenPos();
|
|
ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
|
|
|
// Reserve inline space
|
|
ImGui::Dummy(ImVec2(width, height));
|
|
|
|
// Find min/max for Y auto-scale
|
|
float min_val = values[0];
|
|
float max_val = values[0];
|
|
for (int i = 1; i < count; i++) {
|
|
if (values[i] < min_val) min_val = values[i];
|
|
if (values[i] > max_val) max_val = values[i];
|
|
}
|
|
float range = max_val - min_val;
|
|
if (range < 1e-6f) range = 1.0f; // avoid division by zero for flat lines
|
|
|
|
// Fill area under curve (low alpha)
|
|
if (count >= 2) {
|
|
ImU32 fill_color = IM_COL32(
|
|
(int)(color.x * 255),
|
|
(int)(color.y * 255),
|
|
(int)(color.z * 255),
|
|
40);
|
|
|
|
// Build fill polygon: baseline bottom-left -> points -> baseline bottom-right
|
|
// We use AddConvexPolyFilled workaround: draw as a series of triangles from baseline
|
|
float x0 = pos.x;
|
|
float y_base = pos.y + height;
|
|
|
|
for (int i = 0; i + 1 < count; i++) {
|
|
float xa = x0 + ((float)i / (count - 1)) * width;
|
|
float xb = x0 + ((float)(i + 1) / (count - 1)) * width;
|
|
float ya = pos.y + height - ((values[i] - min_val) / range) * height;
|
|
float yb = pos.y + height - ((values[i + 1] - min_val) / range) * height;
|
|
|
|
draw_list->AddQuadFilled(
|
|
ImVec2(xa, y_base),
|
|
ImVec2(xa, ya),
|
|
ImVec2(xb, yb),
|
|
ImVec2(xb, y_base),
|
|
fill_color);
|
|
}
|
|
}
|
|
|
|
// Draw polyline
|
|
ImU32 line_color = IM_COL32(
|
|
(int)(color.x * 255),
|
|
(int)(color.y * 255),
|
|
(int)(color.z * 255),
|
|
(int)(color.w * 255));
|
|
|
|
for (int i = 0; i + 1 < count; i++) {
|
|
float xa = pos.x + ((float)i / (count - 1)) * width;
|
|
float xb = pos.x + ((float)(i + 1) / (count - 1)) * width;
|
|
float ya = pos.y + height - ((values[i] - min_val) / range) * height;
|
|
float yb = pos.y + height - ((values[i + 1] - min_val) / range) * height;
|
|
draw_list->AddLine(ImVec2(xa, ya), ImVec2(xb, yb), line_color, 1.5f);
|
|
}
|
|
|
|
ImGui::PopID();
|
|
}
|
|
|
|
void sparkline(const char* id, const float* values, int count,
|
|
float width, float height) {
|
|
// Default color: soft green
|
|
sparkline(id, values, count, ImVec4(0.35f, 0.85f, 0.45f, 1.0f), width, height);
|
|
}
|