071aa71a04
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.
59 lines
2.0 KiB
Markdown
59 lines
2.0 KiB
Markdown
---
|
|
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);
|
|
```
|