Three dimensional surface plots

PLPLOT includes routines that will represent a single-valued function of two variables as a surface. In this section, we shall assume that the function to be plotted is Z[X][Y], where Z represents the dependent variable and X and Y represent the independent variables.

As usual, we would like to refer to a three dimensional point (X,Y,Z) in terms of some meaningful user-specified coordinate system. These are called three-dimensional world coordinates. We need to specify the ranges of these coordinates, so that the entire surface is contained within the cuboid defined by $\tt xmin$ < $\tt x$ < $\tt xmax$, $\tt ymin$ < $\tt y$ < $\tt ymax$ and $\tt zmin$ < $\tt z$ < $\tt zmax$. Typically, we shall want to view the surface from a variety of angles, and to facilitate this, a two-stage mapping of the enclosing cuboid is performed. Firstly, it is mapped into another cuboid called the normalized box whose size must also be specified by the user, and secondly this normalized box is viewed from a particular azimuth and elevation so that it can be projected onto the two-dimensional window.

This two-stage transformation process allows considerable flexibility in specifying how the surface is depicted. The lengths of the sides of the normalized box are independent of the world coordinate ranges of each of the variables, making it possible to use ``reasonable'' viewing angles even if the ranges of the world coordinates on the axes are very different. The size of the normalized box is determined essentially by the size of the two-dimensional window into which it is to be mapped. The normalized box is centred about the origin in the x and y directions, but rests on the plane $\tt z=0$. It is viewed by an observer located at altitude alt and azimuth az, where both angles are measured in degrees. The altitude should be restricted to the range zero to ninety degrees for proper operation, and represents the viewing angle above the xy plane. The azimuth is defined so that when az=0, the observer sees the xz plane face on, and as the angle is increased, the observer moves clockwise around the box as viewed from above the xy plane. The azimuth can take on any value.

The first step in drawing a surface plot is to decide on the size of the two-dimensional window and the normalized box. For example, we could choose the normalized box to have sides of length

basex=2.0;
basey=4.0;
height=3.0;
A reasonable range for the x coordinate of the two-dimensional window is -2.5 to +2.5, since the length of the diagonal across the base of the normalized box is $\sqrt{{2^2+4^2}}$ = 2$\sqrt{{5}}$, which fits into this coordinate range. A reasonable range for the y coordinate of the two dimensional window in this case is -2.5 to +4, as the the projection of the normalized box lies in this range for the allowed range of viewing angles.

The routine plwind or plenv is used in the usual way to establish the size of the two-dimensional window. The routine plw3d must then be called to establish the range of the three dimensional world coordinates, the size of the normalized box and the viewing angles. After calling plw3d, the actual surface is drawn by a call to plot3d.

For example, if the three-dimensional world-coordinate ranges are -10.0≤$\tt x$≤10.0, -3.0≤$\tt y$≤ + 7.0 and 0.0≤$\tt z$≤8.0, we could use the following statements:

      xmin2d = -2.5;                                                    
      xmax2d =  2.5;                                                   
      ymin2d = -2.5;                                                    
      ymax2d =  4.0;                                                    
      plenv(xmin2d,xmax2d,ymin2d,ymax2d);
      basex = 2.0;                               
      basey = 4.0;                                                      
      height = 3.0;                                                     
      xmin = -10.0;                                                     
      xmax = 10.0;                                                     
      ymin = -3.0;                                                      
      ymax = 7.0;                                                      
      zmin = 0.0;                                                       
      zmax = 8.0;                                                       
      alt = 45.0;                                                       
      az = 30.0;                                                       
      plw3d(basex,basey,height,xmin,xmax,ymin,ymax,zmin,zmax,alt,az);
      plot3d(x,y,z,work,ly,nx,ny,opt);

The values of the function are stored in a two-dimensional array z[][ly] where the array element z[i][j] contains the value of the function at the point xi, yj. Note that the values of the independent variables xi and yj do not need to be equally spaced, but they must lie on a rectangular grid. Thus two further arrays x[nx] and y[ny] are required as arguments to plot3d to specify the values of the independent variables. The values in the arrays x and y must be strictly increasing with the index. The argument opt specifies how the surface is outlined. If opt=1, a line is drawn representing z as a function of x for each value of y, if opt=2, a line is drawn representing z as a function of y for each value of x, and if opt=3, a net of lines is drawn. The first two options may be preferable if one of the independent variables is to be regarded as a parameter, whilst the third is better for getting an overall picture of the surface. The final parameter work is an integer array with at least four times max(nx,ny) points, which is required for workspace.

Labelling a three-dimensional plot is somewhat more complicated than a two dimensional plot due to the need for skewing the characters in the label so that they are parallel to the coordinate axes. The routine plbox3 thus combines the functions of box drawing and labelling. Its parameters are described more fully in Chapter [*].

The routine plside3 can be used to draw sides on three-dimensional plots to give them a more solid look. Grid lines perpendicular to the z axis can be drawn with the routine plgrid3. Both routines are decribed in Chapter [*].