feat(viz): chord diagram — arcos circulares + cuerdas bezier
Para una matriz NxN: cada nodo ocupa un arco proporcional a sum(row). Las cuerdas matrix[i,j] son bandas bezier cubico hacia el centro conectando los arcos de i y j. Limitacion: las cuerdas se dibujan con AddConvexPolyFilled aunque la forma no sea estrictamente convexa — visualmente queda razonable.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
---
|
||||
name: chord
|
||||
kind: component
|
||||
lang: cpp
|
||||
domain: viz
|
||||
version: "1.0.0"
|
||||
purity: pure
|
||||
signature: "void chord(const char* id, const float* matrix, int n, const char* const* labels, ImVec2 size)"
|
||||
description: "Chord diagram para matrices NxN de relaciones. Arcos circulares proporcionales a sum(row) + bandas curvas internas (bezier cubico) entre arcos."
|
||||
tags: [imgui, drawlist, chart, visualization, chord, matrix, relations]
|
||||
uses_functions: []
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [imgui]
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
file_path: "cpp/functions/viz/chord.cpp"
|
||||
framework: imgui
|
||||
params:
|
||||
- name: id
|
||||
desc: "Identificador unico para PushID"
|
||||
- name: matrix
|
||||
desc: "Array NxN row-major (matrix[i*n + j] = flujo de i a j)"
|
||||
- name: n
|
||||
desc: "Dimension de la matriz cuadrada"
|
||||
- name: labels
|
||||
desc: "Array de N etiquetas, una por entidad. Puede ser nullptr"
|
||||
- name: size
|
||||
desc: "Tamano del area cuadrada del chord. Default 400x400"
|
||||
output: "Renderiza arcos en el borde y cuerdas curvas internas usando AddConvexPolyFilled + AddText"
|
||||
---
|
||||
|
||||
# chord
|
||||
|
||||
Chord diagram. Cada nodo ocupa un arco proporcional a la suma de su fila. Las cuerdas representan la magnitud de cada celda matrix[i,j] como bandas curvas (bezier cubico hacia el centro) que conectan el arco de i con el de j.
|
||||
|
||||
## Limitaciones
|
||||
|
||||
- Las cuerdas se dibujan con `AddConvexPolyFilled` aunque la forma no sea estrictamente convexa — en la practica el renderer ImGui las acepta y queda visualmente razonable.
|
||||
- Para matrices simetricas se dibuja matrix[i,j] y matrix[j,i] como cuerdas separadas que pueden solaparse. El caller puede pasar la matriz triangulada superior + 0s en la inferior si quiere una cuerda por par.
|
||||
- Sin interaccion ni tooltip.
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```cpp
|
||||
const int N = 4;
|
||||
float M[N*N] = {
|
||||
0, 10, 6, 12,
|
||||
8, 0, 14, 3,
|
||||
4, 11, 0, 9,
|
||||
7, 5, 2, 0,
|
||||
};
|
||||
const char* labels[N] = {"AAA", "BBB", "CCC", "DDD"};
|
||||
chord("##flows", M, N, labels);
|
||||
```
|
||||
Reference in New Issue
Block a user