## 7.1 Generating 3D data

By default, the objects that `plotdata` manipulates are vectors, *i.e*. inherently
one-dimensional things. However, one can create a one-dimensional equivalent
of a two-dimensional object by ``unravelling'' the
**m x n** matrix like this:

The last line can then be thought of as a mapping
, where

This presupposes that we know
on a regular array of data points
.
Here's one quick way of creating such a mapping:

`PLOTDATA: `**generate j 0,,99 100**

PLOTDATA: **x=int(j/10)*10**

PLOTDATA: **y=j-x**

PLOTDATA: **z=(x-50)**2*exp(-0.1*(y-5)**2)**

PLOTDATA: **list x,y,z**

PLOTDATA: **density/boxes x,y,z**

We generated three vectors of length 100, and then interpreted them as a
three-dimensional object. The `/boxes` switch shows off one more way of
rendering such a ``surface''.

To do the surface justice, however, it is best to perform the reverse: take a
set of vector (1D) data and then create a regularly-spaced grid matrix out of it:

`PLOTDATA: `**grid m x,y,z**

PLOTDATA: **surface m 0 0 25 -30**

Note that we have used our **regular** arrays `x`, `y`, and
`z` to generate a matrix `m`, but in general `grid` command
will interpolate data as needed, so the input data representing a
surface
need not be known at a regularly-spaced grid of points
.
For our arrays we could have used the option
`grid/nointerpolate` since the data is already regularly spaced.

**Up:** 7. Surfaces, contours, and other 3D plots
**Next:** 8. Real programming: `if`'s and `do`'s
**Previous:** 7. Surfaces, contours, and other 3D plots