Я пытаюсь найти подход к рендерингу DAG чистым, строгим способом, основанным на сетке, и очень короткий.
Я хотел бы сделать что-то похожее на это:
┌───────────┐ ┌───────────┐
┌───│ b │─────▶│ d │
│ └───────────┘ └───────────┘
│
┌───────────┐ │ ┌───────────┐ ┌───────────┐
│ a │◀─┼──▶│ c │──┬──▶│ e │
└───────────┘ │ └───────────┘ │ └───────────┘
│ │
│ │ ┌───────────┐
└──────────────────┴──▶│ f │
└───────────┘
Это будет графическое представление следующих зависимостей: d(b), b(a), e(c), f(c), c(a)
. (box(depends on)
).
Я тщательно изучил графы «направленной силы», но это кажется ненужным, поскольку у меня есть пара ограничений: они должны быть строго на сетке и не должны быть строго иерархическими.
Альтернативные подходы, для которых мне не удалось найти адекватную документацию по разработке алгоритма компоновки, включают различные подходы к «древовидной компоновке», «схеме процесса», «схеме решения» (см. здесь)
Моя конечная цель — создать механизм компоновки для d3 (или аналогичного), который будет отображать что-то интерактивное:
Моя лучшая рабочая теория на данный момент такова:
Пройдитесь по графику и узнайте, сколько столбцов может быть, если их слишком много для области просмотра, подумайте о сворачивании элементов в крайнем левом углу.
Начните размещать вещи в столбцы, размещайте вещи с самыми длинными цепочками справа, а с меньшими цепочками или без цепочек — слева.
Если что-то в столбце имеет зависимость в том же столбце, переместите весь столбец влево и позвольте зависимому занять свое место.
Нарисуйте линии, это должно быть легко, если алгоритм рассматривает только широкие «позиции сетки», а не абсолютные значения пикселей, должно быть легко нарисовать соединительную линию от
A1
(ячейкаa
) доB1
(ячейкаc
);
A B C
│ │
│ │
┌───────────┐ ┌───────────┐
0 ├───│ b │──┼──▶│ d │
│ └───────────┘ └───────────┘
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌───────────┐ │ ┌───────────┐ ┌───────────┐
1 │ a │◀─┼──▶│ c │──┼──▶│ e │
└───────────┘ │ └───────────┘ │ └───────────┘
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
│ │ ┌───────────┐
2 ├──────────────────┼──▶│ f │
└───────────┘
│ │
│ │
Является ли мой подход в основном разумным? Есть ли что-то, что мне не хватает в том, как подойти к этому? Что может кто-нибудь порекомендовать для написания механизмов компоновки, таких как этот?