0b6b984dd3
contour_compute implementa marching squares clasico (16 casos, casos
ambiguos 5 y 10 partidos en 2 segmentos). Para cada level devuelve un
ContourLine{pts, level} con segmentos en coords [0..nx-1]x[0..ny-1].
Verificado con gaussiana 32x32 + 4 niveles: todos los endpoints aparecen
>=2 veces (curvas cerradas, ningun endpoint huerfano).
30 lines
1.1 KiB
C++
30 lines
1.1 KiB
C++
#pragma once
|
|
|
|
// Contour plot 2D via marching squares.
|
|
// Layout puro (contour_compute) separado del render (contour).
|
|
|
|
#include "imgui.h"
|
|
#include <vector>
|
|
|
|
struct ContourLine {
|
|
std::vector<ImVec2> pts; // segmentos: pts[2k], pts[2k+1] forman un segmento
|
|
float level;
|
|
};
|
|
|
|
// Marching squares clasico (16 casos). Para cada nivel, devuelve un ContourLine
|
|
// con los segmentos en coords [0..nx-1] x [0..ny-1] del grid (no escaladas).
|
|
std::vector<ContourLine> contour_compute(const float* grid,
|
|
int nx,
|
|
int ny,
|
|
const float* levels,
|
|
int n_levels);
|
|
|
|
// Render. size.x <= 0 => ancho disponible. Escala los segmentos a la region dada.
|
|
void contour(const char* id,
|
|
const float* grid,
|
|
int nx,
|
|
int ny,
|
|
const float* levels,
|
|
int n_levels,
|
|
ImVec2 size = ImVec2(-1.0f, 300.0f));
|