Skip to content

Latest commit

 

History

History
249 lines (212 loc) · 10.4 KB

README.md

File metadata and controls

249 lines (212 loc) · 10.4 KB

Constructors and combinators for pict

This library provides some extra support for constructing and combining picts. It originated as a helper library for several of my presentations, and since I’ve had some reuse with them, so might others.

(list*of contract) -> contract?
  contract : contract?         

The "contract" constructor that is alluded to by the documentation for table. It is an improper list contract, where the last cons pair’s cdr may be '() or a value satisfying contract.

Examples:                                           
> (andmap (list*of number?) '(3 (0 1) (0 1 . 2) ()))
#t                                                  
> ((list*of number?) '(0 . nope))                   
#f                                                  
(colorize-if test pict color) -> pict?
  test : any/c                        
  pict : pict?                        
  color : color/c                     

A useful pattern: (if test (colorize pict color) pict)

(pin-over-center base x y pict) -> pict?
  base : pict?                          
  x : real?                             
  y : real?                             
  pict : pict?                          

Pin the center of pict to x and y over base.

(pin-over-hcenter base x y pict) -> pict?
  base : pict?                           
  x : real?                              
  y : real?                              
  pict : pict?                           

Like pin-over-center, only centers the x-axis.

(pin-over-vcenter base x y pict) -> pict?
  base : pict?                           
  x : real?                              
  y : real?                              
  pict : pict?                           

Like pin-over-hcenter, but for the y-axis.

(both fn) -> void?        
  fn : (-> boolean? void?)

To be used with slide-producing functions that have only two modes, signified by #t and #f.

(pin-under-all base tag pict) -> pict?
  base : pict?                        
  tag : symbol?                       
  pict : pict?                        

Center pict under all picts that are tagged (with tag-pict) with tag in base.

(pin-over-tag base finder tag wrap) -> pict?         
  base : pict?                                       
  finder : (-> pict? pict-path? (values real? real?))
  tag : symbol?                                      
  wrap : (-> pict? pict?)                            

Find a pict in base tagged tag, apply wrap to the found pict and pin over base at the coordinates given by finder.

(pin-under-tag base finder tag wrap) -> pict?        
  base : pict?                                       
  finder : (-> pict? pict-path? (values real? real?))
  tag : symbol?                                      
  wrap : (-> pict? pict?)                            

Like pin-over-tag, but uses pin-under.

(thick-ellipse  w                                 
                h                                 
                border-width                      
                color                             
               [#:fill-color fill-color]) -> pict?
  w : nonneg-real?                                
  h : nonneg-real?                                
  border-width : (real-in 0 255)                  
  color : color/c                                 
  fill-color : (or/c #f color/c) = #f             

Like ellipse/border, only uses the pen to draw a border rather than layer different colored ellipses. This produces more consistent borders.

(thick-filled-rounded-rectangle  w                            
                                 h                            
                                [corner-radius                
                                 #:color color                
                                 #:style style                
                                 #:angle angle                
                                 #:border-width border-width  
                                 #:border-color border-color] 
                                 #:border-style border-style) 
 -> pict?                                                     
  w : nonneg-real?                                            
  h : nonneg-real?                                            
  corner-radius : real? = -0.25                               
  color : color/c = "black"                                   
  style : brush-style/c = 'solid                              
  angle : real? = 0                                           
  border-width : (real-in 0 255) = 1                          
  border-color : (or/c #f color/c) = #f                       
  border-style : pen-style/c                                  

Like filled-rounded-rectangle, but adds a border with a pen. Can additionally rotate the rectangle by angle.

(filled-rounded-rectangle-frame  pict                          
                                [#:corner-radius corner-radius 
                                 #:scale scale                 
                                 #:x-scale x-scale             
                                 #:y-scale y-scale             
                                 #:color color                 
                                 #:angle angle                 
                                 #:border-width border-width   
                                 #:border-color border-color]  
                                 #:border-style border-style)  
 -> pict?                                                      
  pict : pict?                                                 
  corner-radius : real? = -0.25                                
  scale : nonneg-real? = 1                                     
  x-scale : nonneg-real? = 1                                   
  y-scale : nonneg-real? = 1                                   
  color : color/c = "white"                                    
  angle : real? = 0                                            
  border-width : (real-in 0 255) = 1                           
  border-color : (or/c #f color/c) = #f                        
  border-style : pen-style/c                                   

Uses thick-filled-rounded-rectangle to form a frame around a given pict, and gives the ability to scale uniformly and with each dimension. The x-axis and y-axis are scaled by (* scale x-axis) and (* scale y-axis) respectively.

(filled-flash-frame  pict                                    
                    [#:scale scale                           
                     #:corner-radius corner-radius           
                     #:outline outline                       
                     #:n-points n-points                     
                     #:spike-fraction spike-fraction         
                     #:rotation rotation])           -> pict?
  pict : pict?                                               
  scale : nonneg-real? = 1                                   
  corner-radius : real? = -0.25                              
  outline : (or/c #f color/c) = #f                           
  n-points : exact-positive-integer? = 10                    
  spike-fraction : (real-in 0 1) = 1                         
  rotation : real? = 0                                       

Use slideshow/flash to produce a frame around a given pict. If outline not #f, then additionally draws an outlined flash with the color bound to outline.

(play-n-at n stage stages picts ghost-rest?) -> (listof pict?)
  n : exact-nonnegative-integer?                              
  stage : exact-nonnegative-integer?                          
  stages : (nondecreasing-listof exact-nonnegative-integer?)  
  picts : (listof pict?)                                      
  ghost-rest? : boolean?                                      

Chunks picts into strides of n, for each number in stages. If stage is less than or equal to a stage given in stages, then that stride is present in the output. If not, either stop and produce an empty tail, or ghost the rest of the picts in the tail, depending on ghost-rest?.

(progressive-table  stage                                   
                    stages                                  
                    ncols                                   
                    picts                                   
                    col-aligns                              
                    row-aligns                              
                    col-seps                                
                    row-seps                                
                   [#:ghost? ghost?]) -> pict?              
  stage : exact-nonnegative-integer?                        
  stages : (nondecreasing-listof exact-nonnegative-integer?)
  ncols : exact-nonnegative-integer?                        
  picts : (listof pict?)                                    
  col-aligns : (list*of (pict? pict? . -> . pict?))         
  row-aligns : (list*of (pict? pict? . -> . pict?))         
  col-seps : (list*of real?)                                
  row-seps : (list*of real?)                                
  ghost? : boolean? = #t                                    

An interface for staging rows in a table, that uses play-n-at to produce the picts for table.

Examples:                                                        
> (define (foo stage)                                            
   (define (angles p) (hc-append (t "") p (t "")))             
   (progressive-table stage (list 0 0 1 2) 2                     
                      (list (angles (code x ρ₁ σ₂)) (code 1)     
                            (angles (code (f y) ρ₁ σ₁)) (code 1) 
                            (angles (code x ρ₅ σ₅)) (code 2)     
                            (angles (code (f y) ρ₄ σ₄)) (code 2))
                      lc-superimpose cc-superimpose gap-size 5)) 
                                                                 
> (foo 0)                                                        
                                                                 
> (foo 1)                                                        
                                                                 
> (foo 2)