A Node module for manipulating 2-d data; it is intended as a library for canvas data manipulation, but any
scenario where 2d manipulation of content is required might find this useful.

Data is stored in a flat array, accessed by interpolation of x-y based on width and height of the dataset.
Data can be any sort of format you like - numeric, objects, strings, etc.

The node-topography-canvas library requires data to be arrays of four numbers 0..255 (pref. integral). However,
intermediary data states, such as integral data, are required to drive filters in certain scenarios.

Neighbors returns an array of data within +/- range; only "good" data (data for coordinates on the grid) are returned.

For each value an object is returned:

{

x: x_value,

y: y_value,

distance: self.distance(x, y, x_value, y_value),

orth_distance: self.orth_distance(x, y, x_value, y_value),

x_offset: x_value - x,

y_offset: y_value - y,

value: xy_value,

rise: xy_value - value // if both values are numeric

}

Other than rise, all the properties are related to the x, y coordinates and don't depend on the actual value being any
specific format.

Neighbor values return a pure array of the values; while there is no explicit data or promise of which value came
from what x,y coordinate, they are currently returned in x, y order. This is best for when positionless statistics on
a group of data is required.

the "ring" parameter forces the neighbor method to return boundry values only - so a neighbor(3, 4,

would return data from point (2,3), but neighbor (3, 4, 2, true) would not.

Combine merges two TopoGrids. If clone is true, the combination is returned as a third, new topo; if not,
the combination overwrites the first ( calling) grid. The grids are assumed to be the same size.

The combine_filter is bound to the first grid and has the api(gridA_value, gridB_value, x,
y); the result of the combinder_filter is asserted into the clone, or the first grid.