--- 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" notes: "scaffolding/demo en primitives_gallery" --- # 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); ```