Grid.frink

View or download Grid.frink in plain text format


/** This class makes a grid around a graphics object. */

class Grid
{
   var g2 = undef   // The graphics object this will use to render to.

   var fontInitialized = false  // A flag indicating we've initialized a font

   /** Makes horizontal lines in the current drawing color.

       args:
         g:        An already-generated graphics object that we're going to
                   generate lines for.
         stepSize: the interval between lines.  This should have the same
                   dimensions as the vertical axis of the graphics object
         enclose:  A boolean flag.  If true, this makes at least one line
                   above and below the object, enclosing it.
   */

   makeHorizontalLines[g is graphics, stepSize, enclose = false] :=
   {
      if g2 == undef
         g2 = new graphics
      
      [west, north, east, south] = getBoundingBox[g]
      if enclose
      {
         southest = ceil[south, stepSize]
         northest = floor[north, stepSize]
      } else
      {
         southest = floor[south, stepSize]
         northest = ceil[north, stepSize]
      }
      
      for lat = northest to southest + 1/2 stepSize step stepSize
         g2.line[west, lat, east, lat]
   }

   /** Makes labels on the sides of the grid.

       args:
         g:        An already-generated graphics object that we're going to
                   generate labels for.
         stepSize: the interval between lines.  This should have the same
                   dimensions as the vertical axis of the graphics object
         enclose:  A boolean flag.  If true, this makes at least one label
                   above and below the object, enclosing it.
   */

   makeHorizontalLabels[g is graphics, stepSize, unit, enclose = false] :=
   {
      if ! fontInitialized
         initializeFont[g]
      
      [west, north, east, south] = getBoundingBox[g]
      if enclose
      {
         southest = ceil[south, stepSize]
         northest = floor[north, stepSize]
      } else
      {
         southest = floor[south, stepSize]
         northest = ceil[north, stepSize]
      }
      
      for lat = northest to southest + 1/2 stepSize step stepSize
      {
         g2.text[" " + format[lat, unit, 0], east, lat, "left", "center"]
         g2.text[format[lat, unit, 0] + " ", west, lat, "right", "center"]
      }
   }

   /** Makes vertical lines in the current drawing color.

       args:
         g:        An already-generated graphics object that we're going to
                   generate labels for.
         stepSize: the interval between lines.  This should have the same
                   dimensions as the horizontal axis of the graphics object
         enclose:  A boolean flag.  If true, this makes at least one line
                   to the left and right the object, enclosing it.
   */

   makeVerticalLines[g is graphics, stepSize, enclose = false] :=
   {
      if g2 == undef
         g2 = new graphics
      
      [west, north, east, south] = getBoundingBox[g]
      if enclose
      {
         westest = floor[west, stepSize]
         eastest = ceil[east, stepSize]
      } else
      {
         westest = ceil[west, stepSize]
         eastest = floor[east, stepSize]
      }
      
      for long = westest to eastest + 1/2 stepSize step stepSize
         g2.line[long, north, long, south]
   }

   /** Makes vertical labels in the current drawing color.

       args:
         g:        An already-generated graphics object that we're going to
                   generate labels for.
         stepSize: the interval between lines.  This should have the same
                   dimensions as the horizontal axis of the graphics object
         enclose:  A boolean flag.  If true, this makes at least one line
                   to the left and right of the object, enclosing it.
   */

   makeVerticalLabels[g is graphics, stepSize, unit, enclose = false] :=
   {
      if ! fontInitialized
         initializeFont[g]
      
      [west, north, east, south] = getBoundingBox[g]
      if enclose
      {
         westest = floor[west, stepSize]
         eastest = ceil[east, stepSize]
      } else
      {
         westest = ceil[west, stepSize]
         eastest = floor[east, stepSize]
      }
      
      for long = westest to eastest + 1/2 stepSize step stepSize
      {
         g2.text[format[long, unit, 0], long, south, "center", "top"]
         g2.text[format[long, unit, 0], long, north, "center", "bottom"]
      }
   }

   /** Sets the current drawing color to the specified color. */
   color[c is color] :=
   {
      if g2 == undef
         g2 = new graphics
      
      g2.color[c]
   }

   /** Sets the current drawing color to the specified color. */
   color[r, g, b, a=1] :=
   {
      if g2 == undef
         g2 = new graphics
      
      g2.color[r, g, b, a]
   }

   /** Sets the font name and height of the font.  This is analogous to
       graphics.font[fontName, height] */

   font[fontName, height] :=
   {
      if g2 == undef
         g2 = new graphics
      
      g2.font[fontName, height]
      fontInitialized = true
   }

   /** If the font has not been initialized to something, its dimensions will
       be unknown and labels won't be sized correctly.  This allocates a
       graphics object and tries to guess a reasonable font height based on
       the size of the graphic. */

   initializeFont[g is graphics] :=
   {
      if g2 == undef
         g2 = new graphics

      if ! fontInitialized
      {
         [west, north, east, south] = getBoundingBox[g]
         height = (south - north) / 60
         font["Monospaced", height]
         fontInitialized = true
      }
   }
}


View or download Grid.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 was born 18050 days, 18 hours, 20 minutes ago.