Personal tools


From HaskellWiki

< Diagrams(Difference between revisions)
Jump to: navigation, search
(Potential projects)
(DSL for identifying subdiagrams)
Line 127: Line 127:
=== DSL for identifying subdiagrams ===
=== DSL for identifying subdiagrams ===
It would be extremely useful if subdiagrams could be identified with some "english-like" language. For example, "the smallest circle" or "the third square from the left". Then we would not always need to name subdiagrams and we would gain the ability to modify diagrams and subdiagrams after they have been created. Things like <hask>"the line connecting the two triangles" # lw 0.2 # lc red</hask>, and perhaps even, <hask>delete "the polygon with 5 sides"</hask> become possible. The idea would be to start with something very simple that we could add to incrementally.
It would be extremely useful if subdiagrams could be identified using a small combinator DSL. For example, <hask>isLine `which` (connects isTriangle isTriangle)</hask> to return the line in a diagram connecting two triangles. Or <hask>smallest `which` isCircle</hask> the get the smallest circle. Then we would not always need to name subdiagrams and we would gain the ability to modify diagrams and subdiagrams after they have been created. Things like <hask>(isSquare `which` hasEdge 2) # lw 0.2 # fc red</hask>, and perhaps even, <hask>delete $ isPoly `which` (numSides 5)</hask> become possible. The idea would be to start with something very simple that we could add to incrementally.
==Officially supported backends==
==Officially supported backends==

Revision as of 19:08, 11 September 2013


1 Potential projects

Looking for something to work on? Try one of these!

1.1 Port cool examples to diagrams

There is actually quite a lot of value in taking some existing cool graphics or animations and reimplementing them using diagrams, both as a way to obtain some cool examples for the gallery, and to help drive new features in diagrams or active. (So examples that we would like to be able to describe in diagrams but cannot easily do are particularly interesting---what feature(s) would need to be added to make them possible?)

Some possible sources of inspiration:

1.2 Include animations in the gallery and user manual

We need some sort of infrastructure for including animations in the gallery and/or user manual. See .

1.3 GUI application for creating diagrams interactively

Having a tight feedback loop between coding and seeing the reflected changes in a diagram is important. Right now some of the backends have a "looped" compilation mode, but it's somewhat clunky and still a lot slower than it could be, probably due to overheads of compilation, linking, etc.

The idea would be to develop a GUI application allowing the user to edit diagrams code (either with an in-application editing pane or in their own editor, perhaps using fsnotify to watch for changes) and see the updated diagram immediately. Additional potential features include:

  • the ability to "zoom in" on a selected subcomponent to display, instead of always displaying everything in the entire file
  • using sliders, input boxes, etc. to interactively display parameterized diagrams, perhaps in a type-directed way (see craftwerk-gtk for inspiration)
  • Interactive editing of diagrams, e.g. dragging a displayed component and having an appropriate translation call automatically added to the code, or some other sort of support for interactively generating points, vectors, scaling factors, etc. using mouse input
  • Support for developing animations (e.g. with a slider for moving back+forth in time)

Perhaps this could be built on top of GTK and diagrams-cairo, or for maximal platform independence perhaps it could use something like threepenny-gui and diagrams-sunroof.

1.4 Path operations

It would be nice if diagrams could support various operations on paths such as intersection and union, curve fitting, and path simplification. See also Diagrams/Dev/Paths, which has quite a bit of information on current efforts to implement path offsets and other path-related things.

A student taking this on would probably already need some experience in computational geometry and paths in particular; implementing path algorithms properly is notoriously tricky (though having an incomplete and buggy implementation that nonetheless works "most of the time" would still be better than nothing!).

For more ideas see

1.5 Taking advantage of diagram tree structure

Diagrams are stored using a fancy tree data structure, but currently diagrams backends cannot take advantage of this information: diagrams are simply compiled into a list of primitives with attributes, and these are handed off to the backend. This has some important implications:

  • Sometimes it leads to inefficiency. For example, the diagrams code fc blue (hcat $ replicate 1000 (circle 1)) results in backends setting the fill color 1000 times (once for each circle), when instead the fill color ought to be set just once.
  • There are additional features which could be implemented if backends were able to observe the tree structure, such as grouping for transparency.

The project would consist in first figuring out how best to change the backend interface to allow observing the tree structure, and then implementing new features and improvements to backends based on this new ability.

The devil's in the details: working with the diagram trees can be tricky. This is not a project for the faint of heart, but if you like getting down into tricky details, understanding them, and coming up with creative and elegant ways to achieve a goal given a number of constraints, this could be a fun project with a big impact.

1.6 Constraint Based Diagrams

Generate diagrams that meet some declarative constraint specification---perhaps something along the lines of . The idea is to allow users to specify constraints on their diagram layout (e.g. "A should be no further left than B", "C and D should be at least 2 and at most 8 units apart"), probably using simple linear inequalities, and then solve them to generate an appropriate layout.

A large part of the project would be in simply coming up with a good design for the user API and how to collect constraints; the rest would consist in figuring out how to solve the constraints (either directly, or by hooking up to some other library to e.g. solve systems of linear constraints). See also .

1.7 Search for Interesting Diagrams

Inspired by QuickCheck and SmallCheck, the idea is to probe some function that produces a diagram to explore the range of diagrams it can produce. Instead of looking for failures it would be looking for differences (visually, in path complexity, time, space, etc.). Such a tool could be useful for generating galleries displaying the capabilities of some diagram generating function or debugging some function to find inputs that do not produce output in the expected visual range.

1.8 3D diagrams

Diagrams notionally supports arbitrary vector spaces, but no one has yet done the necessary work to make three-dimensional diagrams a reality. This project would have two main components:

  • Add three-dimensional primitives and functions to diagrams-lib.
  • Work on one (or more) backends that can render 3D diagrams in some way. Options include developing the stub diagrams-povray backend, or developing an OpenGL backend.

A related project is to create projections of 3D objects to 2D for use with the current backends. These can be useful for diagrams that go into documentation and can be thought of as illustrations of 3D objects or simple animations. There are many examples of how to do this, one that I found quite accessible can be found here (hat tip to Joel Burget on twitter for the link).

1.9 External Rendering

The idea here would be to allow for special external rendering of some primitive that Diagrams does not support. For instance, it would be nice to be able to express LaTeX expressions and when the backend renders, offload the work externally then incorporate it with the output. There are several dimensions to supporting this well and making it as backend agnostic as possible. Somewhat related is the idea of external layout such as asking GraphViz to layout some structure then doing the rendering based on those positions. At the simplest this is just turning some new primitive into an `Image` primitive on the fly in the `Renderable` instance.

1.10 Variable Precision

It would be nice to be able to trade off precision of the vector output of some backend with the size of that output. For instance the factorization diagrams are rather large when rendered to SVG, but their size could be cut in half by emitting doubles formatted to two significant digits. There is a nice balance that could be struck at a high level where we ensure that we are always within some fraction of what will likely be a pixel in the final output. Then at the level of the backend we would only need to choose the representation that is the smallest for any particular number.

This could be aided by generalized R2.

1.11 Auto-generated "simple" prelude

The diagrams library is extremely polymorphic---much too polymorphic for beginning users, perhaps. The goal of this project would be to write some code to automatically generate a module Diagrams.Prelude.Simple which re-exports things from Diagrams.Prelude but with more monomorphic types. This would require obtaining the types of things exported by Diagrams.Prelude, doing some analysis to determine what "simpler" type to use, then outputting the appropriate code. There are some interesting, nontrivial questions to be worked out in terms of how to generate a "simple" type from a more general one. There may even be room for multiple "levels" with successively more polymorphism.

1.12 Contrib module for graph drawing

We have a contrib module for drawing trees; it would be nice to have something for drawing more general graphs. One idea would be to round-trip graph data through Graphviz to do the layout; then it is just a matter of allowing the user to describe how they want their graph styled and visualized.

1.13 Do a better job combining envelopes

Add extra intensional information to help do a better job with combining envelopes? e.g. inner and outer bounding boxes, circles, etc. e.g. if the outer bound of one lies completely inside the inner bound of another, the resulting combined envelope can be optimized to not actually do a max operation.

1.14 Convert SVG files to diagrams

It's impossible to support all the features of SVGs, but for a nontrivial subset of SVG it should be possible to parse an SVG file and convert it into a Path and/or a Diagram. This would be a really cool way to allow importing components more easily generated with some other tool---for example, use something like Inkscape to create some paths (using some of Inkscape's advanced tools, drawing them freehand, or whatever), export as SVG, then import those paths into a diagram and use/process them further.

1.15 Auto-generate "connect the dots" puzzles

You know those "connect-the-dots" activities for kids? It would be fun to take (say) an SVG as input (this depends on the previous project) and output a "connect-the-dots" version. Fun for the whole family.

1.16 Website redesign

Do you know something about web design? It would be nice to have a real, modern design for the diagrams website. Any new design should be easy to integrate with our existing website generator built using hakyll.

1.17 DSL for identifying subdiagrams

It would be extremely useful if subdiagrams could be identified using a small combinator DSL. For example,
isLine `which` (connects isTriangle isTriangle)
to return the line in a diagram connecting two triangles. Or
smallest `which` isCircle
the get the smallest circle. Then we would not always need to name subdiagrams and we would gain the ability to modify diagrams and subdiagrams after they have been created. Things like
(isSquare `which` hasEdge 2) # lw 0.2 # fc red
, and perhaps even,
delete $ isPoly `which` (numSides 5)
become possible. The idea would be to start with something very simple that we could add to incrementally.

2 Officially supported backends

2.1 Native SVG

A Haskell-native backend generating SVG. As of diagrams-0.6 this is the default "out-of-the-box" diagrams backend.

  • hackage
  • github repo
  • Status: active development
  • Participants: Deepak Jois, Ryan Yates, Felipe Lessa, Brent Yorgey

2.2 Cairo

Full-featured backend using cairo.

2.3 GTK

Backend built on top of the cairo backend for rendering directly to GTK windows.

2.4 Native Postscript

Very similar to the Cairo backend but only outputting EPS.

3 Unofficial backends

3.1 PDF

3.2 GHCJS/canvas

  • github repo
  • Status: active development
  • Participants: Daniil Frumin, Luite Stegeman

3.3 OpenGL

  • github repo
  • Status: active development
  • Participants: Daniel Bergey

3.4 HTML5 canvas

  • github repo
  • Status: dormant
  • Participants: Jan Bracker, Andy Gill, Brent Yorgey

3.5 LaTeX/TikZ

3.6 POV-Ray

A POV-Ray backend for 3D diagrams.

  • github repo
  • Status: proof of concept only, needs someone to take it over!

4 Related packages and tools

4.1 command-line/interactive

See also an earlier project in a similar direction:

4.2 Writing

4.3 Build service

diagrams-builder is a library providing the ability to dynamically interpret diagrams code snippets, including utilities for creating temporary files etc. as needed. Useful for making preprocessing tools for embedding diagrams code in other document formats (e.g. LaTeX).

4.4 Fonts

The SVGFonts package implements Haskell-native font support (for fonts in the SVG-font format) that can be plugged into diagrams.

5 Other projects

5.1 gtk-toy

Michael Sloan's gtk-toy project is a framework for creating interactive gtk/cairo applications. gtk-toy-diagrams provides tools for using diagrams in conjunction with gtk-toy.

5.2 LaTeXgrapher

LaTeXGrapher is a project by Ryan Yates providing a domain-specific language for producing mathematical graphs, backed by the diagrams-postscript backend.

Deepak Jois is working on a logo interpreter written in Haskell, using diagrams as a backend.

6 Packages using diagrams