来自 RCC(8) 规范或类似规范的维恩图生成软件

请注意:虽然赏金不再可用,但我仍然热衷于任何对这个问题有答案的人做出贡献;我仍然在看它,我在等着看是否有更好的答案。谢谢,请继续阅读...


我正在寻找一种方法,将描述约束网络的任意一组类似RCC的空间关系(或类似关系)转换为类似维恩图的图像。例如,RCC8 中表示的约束网络:

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

..可以用以下具有圆形或方形区域的图来表示:

Example 1: Venn diagram representing constraint network using circular regions...或者:Venn diagram representing constraint network using square regions.

有没有人知道软件至少可以从类似RCC的约束规范中以编程方式(通过API)生成这样的图表?

我知道这样的约束网络可能被低估了,排除了与任何单个此类图的匹配(可能存在许多解决方案)。理想情况下,我希望通过能够生成可能的替代方案来处理这个问题,但现在可以不诉诸任何替代方案(并引发错误)。

为了清楚起见,在这个问题上,我特别要求软件能够以声明性的方式基于类似RCC的约束来计算图表布局。我不关心将RCC的DSL转换为其他语法的工具,也不关心特定的图像序列化格式或方法。我希望找到一种算法来做到这一点,以处理最多六个唯一集合的任意数量的约束。

注意:Graphviz(如下@vickirk所述)是图表布局软件包的一个例子,类似于我所追求的。不幸的是,Graphviz本身似乎无法帮助解决这个问题(但我很乐意被证明是错误的!这似乎是一个非常困难的问题。


答案 1

谁需要后端?下面是一个使用 HTML/CSS/JS 的工作原型

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

只需在字段中输入RCC8代码语法,然后点击按钮!

HTML/CSS/JS RCC8 Diagram Builder

当前的一些限制:

  • 不处理歧义
  • 如果语法关闭,则没有错误处理
  • 在一些有效的情况下可能会中断(我没有测试太多)
  • 没有实现任何逆例(还没有?

编辑:它是如何工作的

基本上,这些图表显示了两个关系系列

  • A 包含 B
  • A 与 B 相邻

然后是子类型或变体,例如:

  • A 包含 BB 与 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>
  • 邻接,具有重叠:(添加一个包装器以在子元素上触发CSS - 第二个元素具有负左边距以重叠第一个元素。<div class="ven"><div class="region"></div><div class="region touches-parent"></div></div>

在jsfiddle中注释掉了一些静态标记,显示了我开始的结构。

为了完成函数循环,需要一些代码将 RCC8 语句解析为 A {XX} B 部分,并尝试为每个部分呈现必要的标记。它会检查,因为它不会重复区域。之后,我还会遍历并将所有兄弟姐妹的高度设置为相同,这可确保它们将重叠和/或正确相邻。

这段代码实际上只是一个开始,它有它的自负。它基本上是一个线性图,这意味着它不处理例如存在复杂邻接的情况,例如:

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

这些可能是智能的JS解析和更复杂的CSS,但可能很快就会冒险进入更强制导向的布局领域(例如,更智能气泡图)。


答案 2

我不知道有任何软件可以生成这样的图表。但是,如果我必须解决您的问题,我可能会探索使用可缩放矢量图形(SVG)的可能性。我认为你可以将RCC的DSL转换为SVG XML,然后你可以渲染它(也许在Web浏览器中)。您可以通过搜索“svg维恩图”在Web上轻松找到示例。这里有一个很好的:这是我从该网站生成的图表

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>

还有一个名为Batik的SVG Apache工具包,它应该支持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 代码中可以看出,您可以在 X () 的西南部绘制 Y 圆,表示 Y 的锚点也在西南部 ()。您可以在此处找到更复杂的示例,并在此处找到一些其他讨论。X.south westanchor=south west

虽然这还不是一个为你绘制RCC8关系的布局算法,但我认为你可以定义LaTeX宏,将RCC8关系转换为PGF / TikZ宏。缺点是您必须编译LaTeX代码。

我希望这有帮助,祝你好运!