CenterStage Object Class: Surface Subclass of the Root class The Surface class is one of the basic classes in CenterStage. It allows you to create parametric surfaces and specify their domains, colorations, etc. In addition to the basic directives, the Surface class supports the following: Function params func [vfunc] This directive defines the function that gives the surface parametrically. The "params" argument is a list of the two parameters to be used in the function, and "func" gives a TCL script that is used to compute the value of the function for any given values of the parameters. For example Function {u v} { let (x,y,z) = (u,v,u^2-v^2) } defines a saddle surface in three-space. The script should use the values of the parameters (TCL variables that will be set to the correct values before the script is executed) to compute values for each of the variables listed in the Axes directive (which are {x y z} by default). The script can compute its values in any way it wants, either individually, as in Function {u v} { let x = u+v let y = x^2 let z = x + y^3 } or as a triple (as in the example above). The script can use any TCL commands, including if-then, loops, even procedure calls. The script has access to all the variables defined by the Setup script, and to the variables that are bound to sliders, type-ins and check-boxes. CenterStage computes the values of the surface function on the domain grid by using two nested loops: the outermorst loop runs through the values of the second parameter and the innermost loop runs through the values of the first paramter. If given, the "vfunc" argument specifies a script that should run every time the outermost loop changes value but before the innermost loop starts. This allows you to perform computations that depend only on the second parameter once for each value of that parameter (rather than repeating the computation for every different value of the first parameter as well). For example, if you are using the second parameter as the parameter of a curve and other parameter to build a surface over that curve using its Frenet frame, you can caompute the frame in the "vfunc" script and save considerable computation time since it will only be computed when the position along the curve changes. Domain {{umin umax udivs} {vmin vmax vdivs}} This specifies the range for the parameters and how many divisions to make within each interval. Thus the domain is a square patch in the domain space, and it is divided into a grid (with the number of divisions specified by udivs and vdivs). The function will be evaluated at the corners of each of the subdivisions of the domain, and a rectangular patch will be used to interpolate between the results of the function at these points. The surface is assumed to be continuous. You can specify several domains at once using the form: Domain { {{um1 uM1 un1} {vm1 vM2 vn2}} {{um2 uM2 un2} {vm2 vM2 vn2}} ... } You can specify a different domain style for each domain by using the following form: Domain { {{um1 uM1 un1} {vm1 vM2 vn2} style1} {{um2 uM2 un2} {vm2 vM2 vn2} style2} ... } where "style1", "style2", etc. are each one of Patch, Grid, BandsU, BandsV, LinesU, LinesV, Dots, Checks, Spots or Weave. For example: Domain { {{-pi/2 0 10} {-pi/2 0 10}} {{0 pi/2 10} {0 pi/2 10} Spots} } specifies that the first patch will use the DOMAIN menu setting while the second will use the Spots domain style.