Download or view GraphicsGrid.frink in plain text format
/** This is a class for laying out graphics objects in a grid.
See GraphicsGridTest.frink for examples of its use.
*/
class GraphicsGrid
{
// Array of graphics objects
var garray = new array
// Desired number of colums or undef.
var cols = undef
// Insets for each graphic object from 0 to 1
var insets = 0.95
/** Construct a GraphicsGrid with arbitrary number of columns. The number
of columns is chosen perhaps from the square root of the number of items.
*/
new[] :=
{
}
/** Construct a GraphicsGrid with a desired maximum number of columns. */
new[cols] :=
{
this.cols = cols
}
/** Add a graphics object to the grid. */
add[g1] :=
{
// TODO: Test for GraphicsExpression and turn other expression types
// into graphics
garray.push[g1]
}
/** Lay out the grid and return a graphics object. */
layout[] :=
{
g = new graphics
//g.color[0,0,0]
CELL:
for i = rangeOf[garray]
{
g1 = garray@i
if g1 == undef
next CELL
[cx, cy, width, height] = getCenter[i]
if g1 != undef
{
//g.save[] // save and restore are already done by addCenter
g.addCenter[g1, cx, cy, width, height]
//g.restore[]
}
}
return g
}
/** Sets the inset size of each box from 0 to 1. If insets is 0.95, each
grid box will take up 95% of width and height. If insets is 1, each
grid box will take up 100% of width and height. */
setInsets[n] :=
{
insets = n
}
/** Private method to return the center coordinates and size for the
specified index.
Returns [cx, cy, width, height]
*/
getCenter[index] :=
{
wcols = cols // Working columns value
if wcols == undef // Try to make approximately square if undefined
wcols = ceil[sqrt[length[garray]]]
// This is laying out left-to-right with specified number of columns
row = index div wcols
col = index mod wcols
return [col, row, 1 insets, 1 insets]
}
}
Download or view GraphicsGrid.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen, eliasen@mindspring.com