java - simetrica - Software de generación de diagramas Venn de la especificación RCC(8) o similar
hacer un conjunto en java (3)
Tenga en cuenta: Aunque la recompensa ya no está disponible, todavía estoy dispuesto a que cualquier persona con una respuesta a esta pregunta contribuya; Todavía lo estoy viendo, y estoy esperando a ver si hay una mejor respuesta. Gracias, y por favor siga leyendo ...
Estoy buscando una manera de convertir un conjunto arbitrario de relaciones espaciales similares a RCC (o similar) que describan una red de restricción en imágenes de diagrama de Venn. Por ejemplo, la red de restricción como se expresa en RCC8:
W {EC} Y
, X {TPP} Y
, Z {NTPP} Y
, Z {PO} X
..podría ser representado por el siguiente diagrama con regiones circulares o cuadradas:
..alternativamente:
¿Alguien conoce el software que puede al menos generar dichos diagramas mediante programación (a través de una API) a partir de una especificación de restricciones similares a RCC?
Soy consciente de que una red de restricción de este tipo podría estar subespecificada, lo que excluye la coincidencia con cualquiera de estos diagramas (pueden existir muchas soluciones). Idealmente, me gustaría lidiar con esto al poder generar posibles alternativas, pero puedo recurrir a ninguna (y generar un error) por ahora.
Para ser claro, en esta pregunta, estoy pidiendo específicamente un software que pueda calcular un diseño de diagrama basado en restricciones de tipo RCC de manera declarativa . No me interesan las herramientas para convertir un DSL para RCC en otra sintaxis, ni me interesan los formatos o métodos de serialización de imágenes en particular. Espero encontrar un algoritmo para hacer esto con un número arbitrario de restricciones para hasta seis conjuntos únicos.
Notas: Graphviz (como se menciona a continuación en @vickirk) es un ejemplo de un paquete de software de diseño de diagramas , que es similar a lo que busco. Desafortunadamente, parece que Graphviz por sí solo no puede ayudar con este problema (¡pero me encantaría que me demostraran que estoy equivocado!). Parece que este es un problema muy difícil.
¿Ha evaluado antlr? Podría definir una gramática EBNF para RCC8. Utilice antlr para generar una lista de elementos. Esta lista de elementos se puede utilizar como entrada para software como VennMaster para dibujar diagramas.
Otras opciones son Goolge Charts,
¿Quién necesita un backend? Aquí hay un prototipo funcional usando HTML / CSS / JS:
Simplemente ingrese la sintaxis del código RCC8 en el campo y presione el botón!
Algunas limitaciones actuales:
- No maneja la ambigüedad.
- No hay manejo de errores si la sintaxis está desactivada
- Probablemente se rompe en algunos casos válidos (no he probado mucho)
- ¿No implementó ningún caso inverso (todavía?)
Edición: Cómo funciona
Básicamente, hay dos familias de relaciones que se muestran con estos diagramas:
- A contiene B
- A es adyacente a B.
Luego hay subtipos o variaciones, como:
- A contiene B y B es tangencial a A
- A es adyacente a B y A se superpone con a B
Ambos conceptos básicos están integrados en el mundo de la representación HTML:
- Contención -> Elementos HTML anidados:
<div class="region"><div class="region"></div></div>
- adyacencia -> elementos HTML hermanos:
<div class="region"></div><div class="region"></div>
Manejo las variaciones con clases especiales que (de manera bastante cruda) mueven los márgenes para lograr el diseño deseado:
- contención, con tangente:
<div class="region"><div class="region touches-parent"></div></div>
(el niño tiene un margen superior negativo para tocar el padre) - adyacencia, con superposición:
<div class="ven"><div class="region"></div><div class="region touches-parent"></div></div>
(se agrega una envoltura a desencadenar CSS en los hijos: el segundo elemento tiene un margen izquierdo negativo que se superpone al primero.)
Hay un marcado estático comentado en el archivo jsfiddle que muestra la estructura con la que comencé.
Para completar el ciclo funcional, hay un poco de código que analiza la declaración de RCC8 en las partes A {XX} B, e intenta representar el marcado necesario para cada parte. Comprueba como va a no duplicar regiones. También paso después y establezco las alturas de todos los hermanos, lo que garantiza que se superpondrán y / o se apoyarán correctamente.
Este código es realmente solo un comienzo, y tiene sus conceptos. Es básicamente un diagrama lineal , lo que significa que no maneja, por ejemplo, casos en los que hay adyacencias complicadas, como esta:
A {EC} B, C {EC} B, D {EC} B
Estos pueden manejarse mediante análisis JS inteligente y CSS más complicado, pero probablemente se aventuren rápidamente en el ámbito de diseños más dirigidos a la fuerza (por ejemplo, un gráfico de burbujas más inteligente ).
No conozco ningún software que pueda generar tales diagramas. Sin embargo, si tuviera que abordar su problema, probablemente exploraría la posibilidad de utilizar gráficos vectoriales escalables (SVG) . Creo que puedes traducir tu DSL para RCC a SVG XML, y luego puedes renderizarlo (tal vez en un navegador web). Puede encontrar fácilmente ejemplos en la Web buscando "svg venn diagram". Una bonita está here : aquí hay un diagrama que genero desde ese sitio web
y aquí está el código SVG correspondiente (también del sitio web):
<?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>
También hay un conjunto de herramientas de Apache para SVG llamado Batik , que debe admitir la visualización, generación o manipulación de SVG.
Otra opción es usar TikZ y PGF con LaTeX: allí tiene macros poderosas que le permiten colocar formas mediante programación, y LaTeX realiza la representación. Aquí hay un ejemplo:
/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}
que produce lo siguiente (es decir, la relación RCC8 TPP):
Puede ver en el código LaTeX que puede dibujar el círculo Y en el suroeste de X ( X.south west
) diciendo que el ancla de Y también está en el suroeste ( anchor=south west
). Puede encontrar un ejemplo más complejo here , y alguna discusión adicional here .
Aunque todavía no es un algoritmo de diseño que dibuja la relación RCC8, creo que puede definir la macro LaTeX que traduce las relaciones RCC8 en macros PGF / TikZ. El inconveniente es que debe compilar el código LaTeX.
Espero que esto ayude. Mucha suerte!