Подтвердить что ты не робот

Программное обеспечение для создания диаграмм Venn из спецификации RCC (8) или аналогичное

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


Я ищу способ конвертировать произвольный набор RCC-подобные пространственные отношения (или подобные), описывающие сеть ограничений в Venn -диграммные изображения. Например, сеть ограничений, выраженная в 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 сам по себе не может справиться с этой проблемой (но я был бы очень рад оказаться ошибочным!). Кажется, это очень трудная проблема.

4b9b3361

Ответ 1

Кому нужен бэкэнд? Здесь рабочий прототип с использованием 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 на дочерних элементах - второй элемент имеет отрицательное левое поле для перекрытия первого.)

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

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

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

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

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

Ответ 2

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

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}

который производит следующее (то есть отношение RCP8 TPP):

enter image description here

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

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

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

Ответ 3

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

Другими параметрами являются Goolge Charts,

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