Tubes
List of pictures
Figure 0001
figure 0001
Figure 0002
figure 0002
Figure 0003
figure 0003
Figure 0004
figure 0004
Figure 0005
figure 0005
Figure 0006
figure 0006
Figure 0007
figure 0007
Figure 0008
figure 0008
Figure 0009
figure 0009
Figure 0010
figure 0010
Figure 0011
figure 0011
Figure 0012
figure 0012
Figure 0013
figure 0013
Figure 0014
figure 0014
Figure 0015
figure 0015
Figure 0016
figure 0016
Figure 0017
figure 0017
Figure 0018
figure 0018
Figure 0019
figure 0019
Figure 0020
figure 0020
Figure 0021
figure 0021
Figure 0001
Figure 0001: fig0010.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
size(12cm,0);

currentprojection=orthographic(0,0.5,1);

// The tube's section used is a path (here an U);
path section=rotate(90)*(N+W--W--E--N+E);

// The tubed curve (yellow tube) has three nodes joined with cubic spline:
path3 p=shift(20X)*scale(10,20,1)*(X..Y..X+Y..cycle);

// A tube is a surface, here the tube is drawn in yellow with purple meshes.
draw(tube(p,section), yellow, bp+purple);
draw(p,red); dot(p);

// The tubed curve (purple tube) has three nodes joined with linear segments:
path3 p=scale(10,20,1)*(X--Y--(X+Y)--cycle);

// Here the tube is drawn in purple with yellow meshes.
draw(tube(p,scale(2)*section), purple, bp+yellow);
draw(p,red); dot(p);

Figure 0002
Figure 0002: fig0020.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
size(10cm,0);

currentprojection=orthographic(0,0.5,1);
path section=rotate(90)*(N+W--W--E--N+E);

// The tubed curve has three nodes joined with linear segments.
path3 p=scale(10,20,1)*(X--Y--(X+Y)--cycle);

// We may use the routine roundedpath in order to obtain rounded corner:
draw(tube(roundedpath(p,r=0.05),
          section,
          corner=100), // Controls the number of elementary tubes at the corners
     purple, bp+yellow+thin());
draw(p,red); dot(p);

Figure 0003
Figure 0003: fig0030.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
size(10cm,0);

currentprojection=orthographic(0,0.5,1);
path section=rotate(180)*(N+W--W--E--N+E);

path3 p=scale(5,10,1)*unitcircle3;

draw(tube(p, section,
          relstep=1/6), // Fix the sample step of the relative time (reltime) of the elementary tubes.
     purple, bp+yellow);
draw(p,red); dot(p);

Figure 0004
Figure 0004: fig0040.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;

size(10cm,0);
currentprojection=perspective(4,3,4);

triple f(real t){
  return t*Z+(cos(2pi*t),sin(2pi*t),0)/sqrt(1+0.5*t^2);
}

path3 p=graph(f,0,2.7,operator ..);
draw(tube(p,scale(0.2)*polygon(5)), purple);

Figure 0005
Figure 0005: fig0050.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;

size(10cm,0);
currentprojection=perspective(4,3,4);
real x(real t) {return (1/sqrt(1+0.5*t^2))*cos(2pi*t);}
real y(real t) {return (1/sqrt(1+0.5*t^2))*sin(2pi*t);}
real z(real t) {return t;}

path3 p=graph(x,y,z,0,2.7,operator ..);
path section=scale(0.2)*polygon(5);

// tube.asy defines a "colored path".
// The value of coloredtype may be coloredSegments or coloredNodes.
// Here the path scale(0.2)*polygon(5) has fixed colored SEGMENTS.
coloredpath cp=coloredpath(section,
                           // The array of pens become automatically cyclic.
                           new pen[]{0.8*red, 0.8*blue, 0.8*yellow, 0.8*purple, black},
                           colortype=coloredSegments);

// Draw the tube, each SEGMENT of the section is colored.
draw(tube(p,cp));

Figure 0006
Figure 0006: fig0060.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;

size(10cm,0);
currentprojection=perspective(4,3,4);
real x(real t) {return (1/sqrt(1+0.5*t^2))*cos(2pi*t);}
real y(real t) {return (1/sqrt(1+0.5*t^2))*sin(2pi*t);}
real z(real t) {return t;}

path3 p=graph(x,y,z,0,2.7,operator ..);
path section=scale(0.2)*polygon(5);

// Here the path scale(0.2)*polygon(5) has colored NODES.
coloredpath cp=coloredpath(section,
                           new pen[]{0.8*red, 0.8*blue, 0.8*yellow, 0.8*purple, black},
                           colortype=coloredNodes);

// Draw the tube, each NODE of the section is colored.
draw(tube(p,cp));

Figure 0007
Figure 0007: fig0070.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;

size(10cm,0);
currentprojection=perspective(4,3,4);
real x(real t) {return (1/sqrt(1+0.5*t^2))*cos(2pi*t);}
real y(real t) {return (1/sqrt(1+0.5*t^2))*sin(2pi*t);}
real z(real t) {return t;}

path3 p=graph(x,y,z,0,2.7,operator ..);
path section=scale(0.2)*polygon(5);

// Define a pen wich depends of a real t. t represent the "reltime" of the path3 p.
pen pen(real t){
  return interp(red,blue,1-2*abs(t-0.5));
}

// Here the section has colored segments (by default) depending to reltime.
draw(tube(p,coloredpath(section,pen)));

Figure 0008
Figure 0008: fig0080.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);
currentprojection=perspective((-1,1,1));

int p=7, q=3;
real n=p/q;
real a=1, b=1;
real x(real t){return a*cos(t);}
real y(real t){return a*sin(t);}
real z(real t){return b*cos(n*t);}

real R(real t){
  real st2=(n*sin(n*t))^2;
  return a*(1+st2)^(1.5)/sqrt(1+st2+n^4*cos(n*t)^2);
  // return -a*(1+st2)^(1.5)/sqrt(1+st2+n^4*cos(n*t)^2); // Signed radius curvature
}

real mt=q*2*pi;
path3 p=graph(x,y,z,0,mt,operator ..)..cycle;

real m=R(0), M=R(0.5*pi/n);

// Define a pen depending to the radius curvature of graph(x,y,z) at reltime t
pen curvaturePen(real t){
  real r=abs(R(t*mt)-m)/(M-m);
  return interp(red,blue,r);
}

// Draw the tube, colors depend of the radius curvature R.
draw(tube(p,coloredpath(scale(0.1)*unitcircle, curvaturePen)));

Figure 0009
Figure 0009: fig0090.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;

size(10cm,0);
currentprojection=perspective(4,3,4);
real x(real t) {return (1/sqrt(1+0.5*t^2))*cos(2pi*t);}
real y(real t) {return (1/sqrt(1+0.5*t^2))*sin(2pi*t);}
real z(real t) {return t;}

path3 p=graph(x,y,z,0,2.7,operator ..);
path section=scale(0.2)*polygon(4);

// Define an array of pen wich depends of a real t. t represent the "reltime" of the path3 p.
pen[] pens(real t){
  return new pen[] {interp(blue,red,t),
      interp(orange,yellow,t),
      interp(green,orange,t),
      interp(red,purple,t)};
}

// "pen[] pens(real t)" allows to color each nodes or segments with a real parameter (the reltime)
// Note that all arrays of pens are convert to cyclical arrays.
draw(tube(p,coloredpath(section,
                        pens,
                        colortype=coloredNodes)));

Figure 0010
Figure 0010: fig0100.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);
currentprojection=orthographic(4,3,2);

real x(real t) {return sin(t);}
real y(real t) {return cos(t);}
real z(real t) {return sqrt(t);}

path3 p=graph(x,y,z,0,4pi,50,operator ..);

path section=subpath(unitcircle,0,2);

pen pens(real t){
  return interp(red,blue,t);
}

// Define a transformation wich will be applied to each section at reltime t.
transform T(real t){return scale(t^0.75/2);}

// Combination of pens and transform:
draw(tube(p,coloredpath(section,pens), T));
draw(p);

Figure 0011
Figure 0011: fig0110.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);
currentprojection=orthographic(4,3,4);

real x(real t) {return sin(t);}
real y(real t) {return 0.5*sin(2*t);}

path g=graph(x,y,0,2pi,50,operator ..);
path3 p=path3(scale(5)*g);

pen pen(real t){
  return interp(red,blue,1-2*abs(t-0.5));
}

draw(tube(p,coloredpath(subpath(unitcircle,1,3),pen)));
draw(p);

Figure 0012
Figure 0012: fig0120.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);
currentprojection=orthographic(1,0,6);

real x(real t) {return sin(t);}
real y(real t) {return 0.5*sin(2*t);}

path g=graph(x,y,0,2pi,50,operator ..);
path3 p=path3(scale(5)*g);

pen[] pens(real t){
  real tt=1-2*abs(t-0.5);
  return new pen[] {interp(red,blue,tt), interp(blue,red,tt)};
}

draw(tube(p,
          coloredpath(polygon(5),pens,colortype=coloredNodes)));
label("colortype=coloredNodes",8*X);

draw(tube(shift(10*Y)*p,
          coloredpath(polygon(5),pens,colortype=coloredSegments)));
label("colortype=coloredSegments",8*X+10Y);

Figure 0013
Figure 0013: fig0130.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph;
size(12cm,0);
currentprojection=perspective(4,3,6);

real f(real t) {return cos(2*t);}
path g=polargraph(f,0,2pi,10,operator ..)&cycle;
path3 p=path3(scale(20)*g);

draw(tube(p,rotate(60)*polygon(3)), 0.8*red);
draw(tube(shift(Z)*p,scale(0.25)*unitcircle), orange);
draw(shift(1.25*Z)*p);

Figure 0014
Figure 0014: fig0140.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph;
size(12cm,0);
currentprojection=perspective(0,3,6);

real f(real t) {return cos(2*t);}
path g=polargraph(f,0,2pi,10,operator --)&cycle;
path3 p=path3(scale(20)*g);

draw(tube(p,2W--2E), red, bp+black);
draw(tube(p,unitcircle), orange, bp+black);

Figure 0015
Figure 0015: fig0150.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);
// currentprojection=perspective((2,1,6),-Z); real q=1;
currentprojection=perspective((-1,1,1)); real q=2;

real x(real t){return (1-cos(t))*cos(q*t);}
real y(real t){return (1-cos(t))*sin(q*t);}
real z(real t){return cos(3t);}

path3 p=graph(x,y,z,0,2pi,20,operator ..);
draw(tube(p,scale(0.4,0.1)*unitcircle), purple);

Figure 0016
Figure 0016: fig0160.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);

currentprojection=perspective(1,-1,0);

real x(real t)
{
return 41*cos(t)-18*sin(t)-83*cos(2t)-83*sin(2t)-11*cos(3t)+27*sin(3t);
}

real y(real t)
{
  return 36*cos(t)+27*sin(t)-113*cos(2t)+30*sin(2t)+11*cos(3t)-27*sin(3t);
}

real z(real t)
{
  return 45*sin(t)-30*cos(2t)+113*sin(2t)-11*cos(3t)+27*sin(3t);
}

path3 p=scale3(0.05)*graph(x,y,z,-pi,pi,200,operator --)&cycle;

path section=scale(2,0.5)*unitcircle;
// path section=scale(2,0.5)*polygon(4);
// path section=scale(2)*polygon(6);
draw(tube(p,section), purple);

Figure 0017
Figure 0017: fig0170.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);

currentprojection=perspective(1,-1,0);


path3 p=scale3(20)*randompath3(20,false,operator--)--cycle;

path section=scale(1,0.5)*unitcircle;
// path section=polygon(6);
// path section=scale(1,0.25)*polygon(4);
draw(tube(p,section), purple, bp+yellow);

Figure 0018
Figure 0018: fig0180.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
size(12cm,0);

currentprojection=perspective(1,-1,0);


path3 p=scale3(20)*randompath3(20,false,operator--)--cycle;

path section=scale(1,0.25)*polygon(4);
draw(tube(roundedpath(p,0.05),section, corner=10), purple);

Figure 0019
Figure 0019: fig0190.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import solids;

size(12cm,0);
currentprojection=perspective((0,0,1));

int p=8, q=3;
real n=p/q, R=2, r=1;

real x(real t){return (R+r*cos(n*t))*cos(t);}
real y(real t){return (R+r*cos(n*t))*sin(t);}
real z(real t){return r*sin(n*t);}

path3 p=graph(x,y,z,0,6pi,200,operator ..)&cycle;

revolution torus=revolution(Circle(R*X,r,Y,10),Z);

transform T(real t){return scale(0.3+0.25*sin(t*20pi));}

pen[] bpen={0.5red,0.5blue};
bpen.cyclic(true);
pen pen(real t){return bpen[ceil(sin(t*20pi)-1e-3)];}

draw(tube(p,coloredpath(polygon(3),pen),T));
// draw(surface(torus),yellow);

Figure 0020
Figure 0020: fig0200.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
// Anneau de Borrommée
// Borromean rings

import tube;
import solids;

size(12cm,0);
currentprojection=perspective((0,0,1));

real a=5, b=2, sq3=sqrt(3);
for (int i=0; i <= 2; ++i) {
  real ai, bi;
  if(i == 0) {
    ai=a/2;
    bi=a*sq3/2;
  } else if(i == 1) {
    ai=-a/2;
    bi=a*sq3/2;
  } else {
    ai=0;
    bi=a*sq3;
  }
  real x(real t){return a*cos(t)+ai;}
  real y(real t){return a*sin(t)+bi;}
  real z(real t){return b*cos(3t);}

  path3 p=graph(x,y,z,0,2pi,100,operator ..)&cycle;


  real trig(real t){return 1-2*abs(t%1-0.5);}
  pen pens(real t) {
    real tt=trig(t+i/3);
    return interp(red,yellow,(tt));
  }

  draw(tube(p, coloredpath(polygon(4),pens)));
}

Figure 0021
Figure 0021: fig0210.asy
(Compiled with Asymptote version 1.87svn-r4652)
    
import tube;
import graph3;
import palette;

size(12cm,0);
currentprojection=perspective(1,1,1);

int e=1;
real x(real t) {return cos(t)+2*cos(2t);}
real y(real t) {return sin(t)-2*sin(2t);}
real z(real t) {return 2*e*sin(3t);}

path3 p=scale3(2)*graph(x,y,z,0,2pi,50,operator ..)&cycle;

pen[] pens=Rainbow(15);
pens.push(black);
for (int i=pens.length-2; i >= 0 ; --i)
  pens.push(pens[i]);

path sec=subpath(Circle(0,1.5,2*pens.length),0,pens.length);
coloredpath colorsec=coloredpath(sec, pens,colortype=coloredNodes);
draw(tube(p,colorsec));

Dernière modification/Last modified: Sun Sep 20 18:47:28 CEST 2009
Philippe Ivaldi

Valide XHTML