function push(xs, ys, v) {
                var index = strokes.length; // the index of this stroke
                strokes.push(v); // add this stroke to the list

                /**
                 * @function minMax
                 * @param {Number[]} rg the list of values to compare
                 * @param {Number} min the initial minimum value
                 * @param {Number} max the initial maximum value
                 *
                 * find the minimum & maximum value in a list of values
                 */
                function minMax(rg, min, max) {
                  for (var _i = rg.length; _i-- > 0; ) {
                    var _v = rg[_i];
                    if (min > _v) min = _v;
                    if (max < _v) max = _v;
                  }
                  return { min: min, max: max };
                }

                // loop through the rows & columns that the curve intersects
                // adding the curve to those slices
                var mmX = minMax(xs, 1, 0);
                var ixMin = Math.max(Math.floor(mmX.min * charGridWidth), 0);
                var ixMax = Math.min(Math.ceil(mmX.max * charGridWidth), charGridWidth);
                for (var iCol = ixMin; iCol < ixMax; ++iCol) {
                  cols[iCol].push(index);
                }

                var mmY = minMax(ys, 1, 0);
                var iyMin = Math.max(Math.floor(mmY.min * charGridHeight), 0);
                var iyMax = Math.min(Math.ceil(mmY.max * charGridHeight), charGridHeight);

                for (var iRow = iyMin; iRow < iyMax; ++iRow) {
                  rows[iRow].push(index);
                }
              }
@function clamp
@param {Number} v the value to clamp
@param {Number} min the minimum value
@param {Number} max the maxmimum value

clamps a value between a minimum & maximum value