--- name: voronoi kind: component lang: cpp domain: viz version: "1.0.0" purity: pure signature: "void voronoi(const char* id, const ImVec2* seeds, int n, const ImU32* colors, ImVec2 size)" description: "Diagrama de Voronoi via raster brute-force (MVP). Para cada tile 4x4 px encontrar seed mas cercano y rellenar con su color." tags: [imgui, drawlist, chart, visualization, voronoi, raster] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "" imports: [imgui] tested: false tests: [] test_file_path: "" file_path: "cpp/functions/viz/voronoi.cpp" framework: imgui params: - name: id desc: "Identificador unico para PushID" - name: seeds desc: "Array de N posiciones (en coords locales del rect, [0..W]x[0..H])" - name: n desc: "Numero de seeds" - name: colors desc: "Array de N colores ImU32 (uno por seed). Si nullptr, usa color default" - name: size desc: "Tamano del area Voronoi. x <= 0 usa el ancho disponible" output: "Renderiza la teselacion de Voronoi como mosaico de tiles 4x4 px coloreados + seeds visibles como circulos blancos sobre negros" notes: "scaffolding/demo en primitives_gallery" --- # voronoi Voronoi diagram MVP via raster brute-force. Para cada tile de 4x4 pixeles del rect de render, calcula el seed mas cercano por distancia Euclidea y rellena el tile con el color de ese seed. ## Limitaciones MVP - **No genera poligonos analiticos** — `voronoi_layout` deja `polygon` vacio. Para extraer poligonos seria necesario half-plane intersections (Fortune's algorithm) — ver issue futuro. - **Tile 4x4 px**: las fronteras son escalonadas. Si se requiere precision sub-pixel, reducir el tile (cuesta O(1/tile^2) en tiempo). - **Performance**: O(W * H * N / tile^2). Para N <= 200 y region 500x500 es < 1ms. ## Ejemplo ```cpp ImVec2 seeds[30]; ImU32 colors[30]; for (int i = 0; i < 30; i++) { seeds[i] = ImVec2(rand_float() * W, rand_float() * H); colors[i] = IM_COL32(rand() & 255, rand() & 255, rand() & 255, 230); } voronoi("##v", seeds, 30, colors, ImVec2(-1, 300)); ```