Рисование аккуратных графиков с общими родителями и детьми

Я работаю над приложением HTML и Javascript, которое будет использовать дерево git и отображать коммиты и слияния в виде направленного графа (например, git log --graph). Я немного читал об аккуратном алгоритме Рейнгольда-Тилфорда, но, похоже, он не применим к графам с узлами, которые имеют как родителей, так и детей. Пример желаемого вывода (в виде текста, но я смотрю на графические библиотеки, такие как d3js и Raphael):

*   - 1 day ago
|
*   - 2 days ago
|\
| * - 3 days ago
|/
*   - 4 days ago
|
*   - 5 days ago

Есть ли какие-нибудь библиотеки, которые уже справляются с этим? Существуют ли примеры (на любом языке) рендеринга подобных графиков? В крайнем случае, я думаю, я попытаюсь воспроизвести график из самого git (https://github.com/git/git/blob/master/graph.c), хотя он немного плотный.

Спасибо за помощь.


person WillP    schedule 28.09.2012    source источник


Ответы (2)


Во-первых, проверьте rubygem Git: http://rubygems.org/gems/git Это сэкономит вам много работы.

Во-вторых, я пробовал работать с d3.js и обнаружил, что он очень сложный и мощный. Граф, который вы собираетесь создать, прекрасно с этим сработает, и даже есть гем d3_rails: http://rubygems.org/gems/d3_rails

Но помните, что если вам нужно только простое графическое представление нескольких фигур для отображения минимальной сложности (без детализации и т. д.), вы можете подумать об использовании холста HTML5. Очень прост в использовании, но ему не хватает мощности d3.js.

person Paul Meier    schedule 28.09.2012
comment
Спасибо. Кстати, я использую рельсы. В настоящее время я использую гем grit (grit.rubyforge.org), но также проверю git . Я не сомневаюсь, что d3.js справится с графикой. Моя проблема в основном заключается в поиске алгоритма для определения пространственного размещения узлов и ребер. - person WillP; 28.09.2012

Через некоторое время реализации моего собственного довольно ужасного графа я услышал о GitLab и их реализации GitHub с открытым исходным кодом. У них есть аналогичная реализация графа «Сеть» из GitHub, которую можно найти в их репозитории.

Некоторые из рассматриваемых файлов:

  • библиотека/gitlab/граф/commit.rb
  • библиотека/gitlab/граф/json_builder.rb
  • продавец/активы/javascripts/branch-graph.js

С некоторой модификацией я смог выяснить, как они реализовали свой сетевой граф, и успешно использую версию их кода.

person WillP    schedule 06.11.2012