8.34 tube

This module extends the tube surfaces constructed in three_arrows.asy to arbitrary cross sections, colors, and spine transformations. The routine

surface tube(path3 g, coloredpath section,
             transform T(real)=new transform(real t) {return identity();},
             real corner=1, real relstep=0);

draws a tube along g with cross section section, after applying the transformation T(t) at point(g,t). The parameter corner controls the number of elementary tubes at the angular points of g. A nonzero value of relstep specifies a fixed relative time step (in the sense of relpoint(g,t)) to use in constructing elementary tubes along g. The type coloredpath is a generalization of path to which a path can be cast:

struct coloredpath
{
  path p;
  pen[] pens(real);
  int colortype=coloredSegments;
}

Here p defines the cross section and the method pens(real t) returns an array of pens (interpreted as a cyclic array) used for shading the tube patches at relpoint(g,t). If colortype=coloredSegments, the tube patches are filled as if each segment of the section was colored with the pen returned by pens(t), whereas if colortype=coloredNodes, the tube components are vertex shaded as if the nodes of the section were colored.

A coloredpath can be constructed with one of the routines:

coloredpath coloredpath(path p, pen[] pens(real),
                        int colortype=coloredSegments);
coloredpath coloredpath(path p, pen[] pens=new pen[] {currentpen},
                        int colortype=coloredSegments);
coloredpath coloredpath(path p, pen pen(real));

In the second case, the pens are independent of the relative time. In the third case, the array of pens contains only one pen, which depends of the relative time.

The casting of path to coloredpath allows the use of a path instead of a coloredpath; in this case the shading behavior is the default shading behavior for a surface.

An example of tube is provided in the file trefoilknot.asy. Further examples can be found at https://web.archive.org/web/20201130113133/http://www.piprime.fr/files/asymptote/tube.