Программное обеспечение для генерации диаграмм Венна из спецификации RCC (8) или аналогичное - PullRequest
24 голосов
/ 21 марта 2011

Обратите внимание: Несмотря на то, что щедрость больше не доступна, я по-прежнему заинтересован в том, чтобы кто-нибудь, ответивший на этот вопрос, мог внести свой вклад;Я все еще смотрю это, и я жду, чтобы видеть, есть ли лучший ответ.Спасибо, и, пожалуйста, читайте дальше ...


Я ищу способ преобразования произвольного набора RCC -подобных пространственных отношений (или аналогичных), описывающих сеть ограничений, вВенн-диаграммы-подобные изображения.Например, сеть ограничений, выраженная в RCC8:

W {EC} Y, X {TPP} Y, Z {NTPP} Y, Z {PO} X.

.., может быть представлена ​​следующей диаграммой с круговой диаграммойили квадратные области:

Example 1: Venn diagram representing constraint network using circular regions. .. альтернативно: Venn diagram representing constraint network using square regions.

Кто-нибудь знает о программном обеспечении, которое может по крайней мере программно генерировать такие диаграммы (через API) из спецификации RCC-подобные ограничения?

Я знаю, что такая сеть ограничений может быть недостаточно задана, что исключает совпадение с какой-либо одной такой диаграммой (может существовать много решений).В идеале я хотел бы иметь дело с этим, имея возможность генерировать возможные альтернативы, но пока не могу прибегнуть к ним (и выдавать ошибку).

Просто чтобы прояснить этот вопрос, который я специально задаюпрограммное обеспечение, которое может вычислять макет диаграммы на основе RCC-подобных ограничений в декларативной манере .Меня не интересуют инструменты для преобразования DSL для RCC в какой-либо другой синтаксис, а также меня не интересуют конкретные форматы или методы сериализации изображений.Я надеюсь найти алгоритм, чтобы сделать это для работы с произвольным числом ограничений для до шести уникальных наборов.

Примечания: Graphviz (как упомянуто ниже @vickirk) - это пример программного пакета для разметки диаграмм , который похож на то, что мне нужно.К сожалению, кажется, что сам Graphviz не может помочь с этой проблемой (но я был бы очень рад оказаться ошибочным!).Кажется, это очень сложная проблема.

Ответы [ 3 ]

19 голосов
/ 30 марта 2011

Кому нужен бэкэнд?Вот рабочий прототип с использованием HTML / CSS / JS:

http://jsfiddle.net/RuvE6/6/

Просто введите синтаксис кода RCC8 в поле и нажмите кнопку!

HTML/CSS/JS RCC8 Diagram Builder

Некоторые текущие ограничения:

  • Не обрабатывает двусмысленность
  • Нет обработки ошибок, если синтаксис выключен
  • Возможноперерывы в некоторых допустимых случаях (я не очень много тестировал)
  • Не реализовано никаких обратных случаев (пока?)

Редактировать: Как это работает

По существу, на этих диаграммах показаны два семейства отношений:

  • A содержит B
  • A находится рядом с B .

Существуют подтипы или варианты, например:

  • A содержит B и B тангенциально к A
  • A смежно с B и A перекрывается с до B

Обе основные концепции представляют собой вид , встроенный в мир рендеринга HTML:

  • сдерживание -> вложенные элементы HTML:<div class="region"><div class="region"></div></div>
  • смежность -> родственные элементы HTML: <div class="region"></div><div class="region"></div>

Я работаю с вариациями с помощью специальных классов, которые (довольно грубо) извлекают поля для достижения желаемого макета:

  • удержание с касательной: <div class="region"><div class="region touches-parent"></div></div> (дочерний элемент имеет отрицательное верхнее поле для прикосновения к родителю)
  • смежность с перекрытием: <div class="ven"><div class="region"></div><div class="region touches-parent"></div></div> (добавлена ​​оболочка для запуска CSS на дочерних элементах - второй элемент имеет отрицательное левое поле для перекрытия первого.)

В некоторой статической разметке, закомментированной в the jsfiddle, показывающий структуру, с которой я начал.

Чтобы завершить функциональный цикл, есть фрагмент кода, который разбирает оператор RCC8 на части A {XX} B и пытается отобразить необходимую разметку для каждой части,Это проверяет, поскольку это идет, чтобы не дублировать области.Я также прошёл потом и установил одинаковую высоту всех братьев и сестер, что гарантирует, что они будут перекрываться и / или упираться должным образом.

Этот код действительно только начало, и у него есть свои тщеславия.Это в основном линейная диаграмма, что означает, что она, например, не обрабатывает случаи, когда существуют сложные смежности, такие как:

A {EC} B, C {EC} B, D {EC} B

Это можетбыть умным JS-разбором и более сложным CSS, но, вероятно, быстро решиться в область более силовых макетов (например, умнее пузырьковая диаграмма ).

2 голосов
/ 24 марта 2011

Я не знаю ни одного программного обеспечения, которое может генерировать такие диаграммы.Однако, если бы мне пришлось решать вашу проблему, я бы, вероятно, изучил возможность использования Scalable Vector Graphics (SVG) .Я думаю, что вы можете перевести DSL для RCC в SVG XML, а затем вы можете отрендерить его (возможно, в веб-браузере).Вы можете легко найти примеры в Интернете, выполнив поиск по запросу «svg venn diagram».Хорошим примером является здесь : вот диаграмма, которую я генерирую с этого сайта

enter image description here

, а также соответствующий код SVG (также с сайта):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg 
    height="150" 
    width="200" 
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink">    
<title >WIBR Venn diagram</title>
    <ellipse 
        cx="141.795128105731" 
        cy="75" 
        id="circle2" 
        rx="58.2048718942687" 
        ry="58.2048718942687" 
        style="fill: gray; fill-opacity: 0.5; stroke: black; stroke-width: 1; stroke-opacity: 1" />
    <ellipse 
        cx="67.2091969126074" 
        cy="75" id="circle1" 
        rx="67.2091969126074" ry="67.2091969126074" 
        style="fill: darkgray; fill-opacity: 0.5; stroke: black; stroke-width: 1; stroke-opacity: 1"/>
</svg>

Существует также инструментарий Apache для SVG под названием Batik , который должен поддерживать отображение, генерацию или манипулирование SVG.

Другой вариант - использовать TikZ& PGF с LaTeX: там у вас есть мощные макросы, которые позволяют программно размещать фигуры, а рендеринг выполняется LaTeX.Вот пример:

\documentclass[a4paper,10pt]{article}

\usepackage{tikz}
\usetikzlibrary{shapes,calc}

\begin{document}

\pagestyle{empty}

\begin{tikzpicture}

    \node (TPP) {X TPP Y};

    \node
        [ circle,
            draw,
            minimum width=2cm,
            label={[label distance=-0.7cm]145:X},
        ] (X) [right of=TPP,xshift=1cm] {};

    \node
        [ circle,
            draw,
            minimum width=1cm,
            anchor=south east,
        ] (Y) at (X.south east) {Y}; 

\end{tikzpicture}

\end{document}

, который производит следующее (т. Е. Отношение RCC8 TPP):

enter image description here

Вы можете увидеть из кода LaTeX, что вы можетенарисуйте круг Y на юго-западе от X (X.south west), сказав, что якорь Y также на юго-западе (anchor=south west).Вы можете найти более сложный пример здесь и дополнительное обсуждение здесь .

Хотя это еще не алгоритм компоновки, который рисует для вас отношение RCC8, я думаюВы можете определить макрос LaTeX, который переводит отношения RCC8 в макросы PGF / TikZ.Недостатком является то, что вы должны затем скомпилировать код LaTeX.

Надеюсь, это поможет и удачи!

0 голосов
/ 24 марта 2011

Вы оценили antlr, Вы можете определить грамматику EBNF для RCC8.Используйте antlr для генерации списка предметов.Этот список элементов может использоваться в качестве входных данных для программного обеспечения, например VennMaster для рисования диаграмм.

Другими вариантами являются диаграммы Гулга,

http://bioinfogp.cnb.csic.es/tools/venny/index.html

...