Skip to content

penrose/penrose

main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Penrose npm (scoped) license Build Twitter: @UsePenrose

Penrose is a platform that enables people to create beautiful diagrams just by typing mathematical notation in plain text. The goal is to make it easy for non-experts to create and explore high-quality diagrams and provide deeper insight into challenging technical concepts. We aim to democratize the process of creating visual intuition.

Check out our SIGGRAPH '20 paper and video on Penrose!

Usage

You can try Penrose in your browser without any installation. For a more detailed step-by-step introduction, check out our tutorials. Or, for more reference-style information, take a look at our documentation.

Example

Here's a simple Penrose visualization in the domain of set theory.

It's specified by the following trio of Domain, Substance, and Style programs (with variation PlumvilleCapybara104):

  • setTheory.domain:

    type Set
    
    predicate Not(Prop p1)
    predicate Intersecting(Set s1, Set s2)
    predicate IsSubset(Set s1, Set s2)
    
  • tree.substance:

    Set A, B, C, D, E, F, G
    
    IsSubset(B, A)
    IsSubset(C, A)
    IsSubset(D, B)
    IsSubset(E, B)
    IsSubset(F, C)
    IsSubset(G, C)
    
    Not(Intersecting(E, D))
    Not(Intersecting(F, G))
    Not(Intersecting(B, C))
    
    AutoLabel All
    
  • venn.style:

    canvas {
      width = 800
      height = 700
    }
    
    forall Set x {
      x.icon = Circle {
        strokeWidth : 0
      }
    
      x.text = Equation {
        string : x.label
        fontSize : "25px"
      }
    
      ensure contains(x.icon, x.text)
      encourage sameCenter(x.text, x.icon)
      x.textLayering = x.text above x.icon
    }
    
    forall Set x; Set y
    where IsSubset(x, y) {
      ensure smallerThan(x.icon, y.icon)
      ensure disjoint(y.text, x.icon, 10)
      ensure contains(y.icon, x.icon, 5)
      x.icon above y.icon
    }
    
    forall Set x; Set y
    where Not(Intersecting(x, y)) {
      ensure disjoint(x.icon, y.icon)
    }
    
    forall Set x; Set y
    where Intersecting(x, y) {
      ensure overlapping(x.icon, y.icon)
      ensure disjoint(y.text, x.icon)
      ensure disjoint(x.text, y.icon)
    }
    

Contributing

See CONTRIBUTING.md.

License

This repository is licensed under the MIT License.