Package sage :: Package plot :: Module tachyon :: Class Tachyon
[hide private]
[frames] | no frames]

Class Tachyon

source code

                      object --+    
                               |    
structure.sage_object.SageObject --+
                                   |
                                  Tachyon


Create a scene the can be rendered using the Tachyon ray tracer.

INPUT:
             xres=350, yres=350,
             zoom = 1.0,
             antialiasing = False,
             aspectratio = 1.0,
             raydepth = 5,
             camera_center = (-3, 0, 0),
             updir = (0, 0, 1),
             look_at = (0,0,0),
             viewdir = None,
             projection = 'PERSPECTIVE'

OUTPUT:
    A Tachyon 3d scene.

Note that the coordinates are by default such that $z$ is up,
positive $y$ is to the \strong{left} and $x$ is toward you.  This is
not oriented according to the right hand rule.

EXAMPLES:
Spheres along the twisted cubic.
    sage: t = Tachyon(xres=512,yres=512, camera_center=(3,0.3,0))
    sage: t.light((4,3,2), 0.2, (1,1,1))
    sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1.0,0,0))
    sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.3, opacity=1.0, color=(0,1.0,0))
    sage: t.texture('t2', ambient=0.2,diffuse=0.7, specular=0.5, opacity=0.7, color=(0,0,1.0))
    sage: k=0
    sage: for i in srange(-1,1,0.05):
    ...    k += 1
    ...    t.sphere((i,i^2-0.5,i^3), 0.1, 't%s'%(k%3))
    ...
    sage: t.show()

Another twisted cubic, but with a white background, got by putting
infinite planes around the scene.
    sage: t = Tachyon(xres=512,yres=512, camera_center=(3,0.3,0), raydepth=8)
    sage: t.light((4,3,2), 0.2, (1,1,1))
    sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1.0,0,0))
    sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.3, opacity=1.0, color=(0,1.0,0))
    sage: t.texture('t2', ambient=0.2,diffuse=0.7, specular=0.5, opacity=0.7, color=(0,0,1.0))
    sage: t.texture('white', color=(1,1,1))
    sage: t.plane((0,0,-1), (0,0,1), 'white')
    sage: t.plane((0,-20,0), (0,1,0), 'white')
    sage: t.plane((-20,0,0), (1,0,0), 'white')
    
    sage: k=0
    sage: for i in srange(-1,1,0.05):
    ...    k += 1
    ...    t.sphere((i,i^2 - 0.5,i^3), 0.1, 't%s'%(k%3))
    ...    t.cylinder((0,0,0), (0,0,1), 0.05,'t1') 
    ...
    sage: t.show()    

Many random spheres:
    sage: t = Tachyon(xres=512,yres=512, camera_center=(2,0.5,0.5), look_at=(0.5,0.5,0.5), raydepth=4)
    sage: t.light((4,3,2), 0.2, (1,1,1))
    sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1.0,0,0))
    sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.3, opacity=1.0, color=(0,1.0,0))
    sage: t.texture('t2', ambient=0.2, diffuse=0.7, specular=0.5, opacity=0.7, color=(0,0,1.0))
    sage: k=0
    sage: for i in range(100):
    ...    k += 1
    ...    t.sphere((random(),random(), random()), random()/10, 't%s'%(k%3))
    ...
    sage: t.show()        


Points on an elliptic curve, their height indicated by their height above the axis:
    sage: t = Tachyon(camera_center=(5,2,2), look_at=(0,1,0))
    sage: t.light((10,3,2), 0.2, (1,1,1))
    sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1,0,0))
    sage: t.texture('t1', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(0,1,0))
    sage: t.texture('t2', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(0,0,1))
    sage: E = EllipticCurve('37a')
    sage: P = E([0,0])
    sage: Q = P
    sage: n = 100
    sage: for i in range(n):   # increase 20 for a better plot
    ...    Q = Q + P
    ...    t.sphere((Q[1], Q[0], ZZ(i)/n), 0.1, 't%s'%(i%3))
    ...
    sage: t.show()

A beautiful picture of rational points on a rank 1 elliptic curve.
    sage: t = Tachyon(xres=1000, yres=800, camera_center=(2,7,4), look_at=(2,0,0), raydepth=4)
    sage: t.light((10,3,2), 1, (1,1,1))
    sage: t.light((10,-3,2), 1, (1,1,1))
    sage: t.texture('black', color=(0,0,0))
    sage: t.texture('red', color=(1,0,0))
    sage: t.texture('grey', color=(.9,.9,.9))
    sage: t.plane((0,0,0),(0,0,1),'grey')
    sage: t.cylinder((0,0,0),(1,0,0),.01,'black')
    sage: t.cylinder((0,0,0),(0,1,0),.01,'black')
    sage: E = EllipticCurve('37a')
    sage: P = E([0,0])
    sage: Q = P
    sage: n = 100
    sage: for i in range(n):  
    ...    Q = Q + P
    ...    c = i/n + .1
    ...    t.texture('r%s'%i,color=(float(i/n),0,0))
    ...    t.sphere((Q[0], -Q[1], .01), .04, 'r%s'%i)
    ...          
    ...
    sage: t.show()    # long time, e.g., 10-20 seconds

A beautiful spiral. 
    sage: t = Tachyon(xres=800,yres=800, camera_center=(2,5,2), look_at=(2.5,0,0))
    sage: t.light((0,0,100), 1, (1,1,1))
    sage: t.texture('r', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1,0,0))
    sage: for i in srange(0,50,0.1):
    ...    t.sphere((i/10,sin(i),cos(i)), 0.05, 'r')
    ...
    sage: t.texture('white', color=(1,1,1), opacity=1, specular=1, diffuse=1)
    sage: t.plane((0,0,-100), (0,0,-100), 'white')
    sage: t.show()



Instance Methods [hide private]
 
__init__(self, xres=350, yres=350, zoom=1.0, antialiasing=False, aspectratio=1.0, raydepth=8, camera_center=(-3, 0, 0), updir=(0, 0, 1), look_at=(0, 0, 0), viewdir=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a..., projection='PERSPECTIVE')
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__repr__(self)
File: sage/structure/sage_object.pyx (starting at line 86)
source code
 
save(self, filename='sage.png', verbose=0, block=True, extra_opts='')
INPUT: filename -- (default: 'sage.png') output filename; the extension of the filename determines the type.
source code
 
show(self, verbose=0, extra_opts='') source code
 
_res(self) source code
 
_camera(self) source code
 
str(self) source code
 
light(self, center, radius, color) source code
 
texfunc(self, type=0, center=(0, 0, 0), rotate=(0, 0, 0), scale=(1, 1, 1))
INPUT:...
source code
 
texture(self, name, ambient=0.2, diffuse=0.8, specular=0.0, opacity=1.0, color=(1.0, 0.0, 0.5), texfunc=0, phong=0, phongsize=0.5, phongtype='PLASTIC')
INPUT: name -- string; the name of the texture (to be used later) ambient -- (default: 0.2) diffuse -- (default: 0.8) specular -- (default: 0.0) opacity -- (default: 1.0) color -- (default: (1.0,0.0,0.5)) texfunc -- (default: 0); a texture function; this is either the output of self.texfunc, or a number between 0 and 9, inclusive.
source code
 
texture_recolor(self, name, colors) source code
 
sphere(self, center, radius, texture) source code
 
cylinder(self, center, axis, radius, texture) source code
 
plane(self, center, normal, texture) source code
 
fcylinder(self, base, apex, radius, texture) source code
 
triangle(self, vertex_1, vertex_2, vertex_3, texture) source code
 
smooth_triangle(self, vertex_1, vertex_2, vertex_3, normal_1, normal_2, normal_3, texture) source code
 
plot(self, f, (xmin, xmax), (ymin, ymax), texture, grad_f=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a..., max_bend=0.7, max_depth=5, initial_depth=3, num_colors=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a...)
INPUT: f -- Function of two variables, which returns a float (or coercable to a float) (xmin,xmax) (ymin,ymax) -- defines the rectangle to plot over texture: Name of texture to be used Optional arguments: grad_f -- gradient function.
source code
 
parametric_plot(self, f, t_0, t_f, tex, r=0.1, cylinders=True, min_depth=4, max_depth=8, e_rel=0.01, e_abs=0.01)
Plots a space curve as a series of speheres and finite cylinders.
source code
 
collect(self, objects)
Add a set of objects to the scene from a collection
source code

Inherited from structure.sage_object.SageObject: __hash__, __new__, _axiom_, _axiom_init_, _gap_, _gap_init_, _gp_, _gp_init_, _interface_, _interface_init_, _interface_is_cached_, _kash_, _kash_init_, _macaulay2_, _macaulay2_init_, _magma_, _magma_init_, _maple_, _maple_init_, _mathematica_, _mathematica_init_, _maxima_, _maxima_init_, _octave_, _octave_init_, _pari_, _pari_init_, _r_init_, _sage_, _singular_, _singular_init_, category, db, dump, dumps, rename, reset_name, version

Inherited from object: __delattr__, __getattribute__, __reduce__, __reduce_ex__, __setattr__, __str__

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, xres=350, yres=350, zoom=1.0, antialiasing=False, aspectratio=1.0, raydepth=8, camera_center=(-3, 0, 0), updir=(0, 0, 1), look_at=(0, 0, 0), viewdir=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a..., projection='PERSPECTIVE')
(Constructor)

source code 
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

__repr__(self)
(Representation operator)

source code 
File: sage/structure/sage_object.pyx (starting at line 86)

Overrides: structure.sage_object.SageObject.__repr__
(inherited documentation)

save(self, filename='sage.png', verbose=0, block=True, extra_opts='')

source code 

INPUT:
    filename -- (default: 'sage.png')
               output filename; the extension of
               the filename determines the type.
               Supported types include:
                 tga -- 24-bit (uncompressed)
                 bmp -- 24-bit Windows BMP (uncompressed)
                 ppm -- 24-bit PPM (uncompressed)
                 rgb -- 24-bit SGI RGB (uncompressed)
                 png -- 24-bit PNG (compressed, lossless)
    verbose -- integer; (default: 0)
               0 -- silent
               1 -- some output
               2 -- very verbose output
    block -- bool (default: True); if False, run the rendering
             command in the background.
    extra_opts -- passed directly to tachyon command line.
             Use tachyon_rt.usage() to see some of the possibilities.

Overrides: structure.sage_object.SageObject.save

texfunc(self, type=0, center=(0, 0, 0), rotate=(0, 0, 0), scale=(1, 1, 1))

source code 


INPUT:
    type -- (default: 0)
         0: No special texture, plain shading
         1: 3D checkerboard function, like a rubik's cube
         2: Grit Texture, randomized surface color
         3: 3D marble texture, uses object's base color
         4: 3D wood texture, light and dark brown, not very good yet
         5: 3D gradient noise function (can't remember what it look like
         6: Don't remember
         7: Cylindrical Image Map, requires ppm filename   (don't know how to specify name in sage?!)
         8: Spherical Image Map, requires ppm filename     (don't know how to specify name in sage?!)  
         9: Planar Image Map, requires ppm filename        (don't know how to specify name in sage?!)
    center -- (default: (0,0,0))
    rotate -- (default: (0,0,0))
    scale -- (default: (1,1,1))

EXAMPLES:
We draw an infinite checkboard:
    sage: t = Tachyon(camera_center=(2,7,4), look_at=(2,0,0))
    sage: t.texture('black', color=(0,0,0), texfunc=1)
    sage: t.plane((0,0,0),(0,0,1),'black')
    sage: t.show()

texture(self, name, ambient=0.2, diffuse=0.8, specular=0.0, opacity=1.0, color=(1.0, 0.0, 0.5), texfunc=0, phong=0, phongsize=0.5, phongtype='PLASTIC')

source code 

INPUT:
    name -- string; the name of the texture (to be used later)
    ambient -- (default: 0.2)
    diffuse -- (default: 0.8)
    specular -- (default: 0.0)
    opacity -- (default: 1.0)
    color -- (default: (1.0,0.0,0.5))
    texfunc -- (default: 0); a texture function; this is either the output of
               self.texfunc, or a number between 0 and 9, inclusive.  See
               the docs for self.texfunc.
    phong -- (default: 0)
    phongsize -- (default: 0.5)
    phongtype -- (default: "PLASTIC")

EXAMPLES:
We draw a scene with 4 sphere that illustrates various uses of the texture command:
    sage: t = Tachyon(camera_center=(2,5,4), look_at=(2,0,0), raydepth=6)
    sage: t.light((10,3,4), 1, (1,1,1))
    sage: t.texture('mirror', ambient=0.05, diffuse=0.05, specular=.9, opacity=0.9, color=(.8,.8,.8))
    sage: t.texture('grey', color=(.8,.8,.8), texfunc=3)
    sage: t.plane((0,0,0),(0,0,1),'grey')
    sage: t.sphere((4,-1,1), 1, 'mirror')
    sage: t.sphere((0,-1,1), 1, 'mirror')
    sage: t.sphere((2,-1,1), 0.5, 'mirror')
    sage: t.sphere((2,1,1), 0.5, 'mirror')
    sage: show(t)        

plot(self, f, (xmin, xmax), (ymin, ymax), texture, grad_f=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a..., max_bend=0.7, max_depth=5, initial_depth=3, num_colors=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a...)

source code 

INPUT:
    f -- Function of two variables, which returns a float (or coercable to a float)
    (xmin,xmax)
    (ymin,ymax) -- defines the rectangle to plot over
    texture: Name of texture to be used
Optional arguments:
    grad_f -- gradient function.  If specified, smooth triangles will be used.
    max_bend -- Cosine of the threshold angle between triangles used to determine 
                whether or not to recurse after the minimum depth
    max_depth -- maximum recursion depth.  Maximum triangles plotted = $2^{2*max_depth}$
    initial_depth -- minimum recursion depth.  No error-tolerance checking is performed
                     below this depth.  Minimum triangles plotted: $2^{2*min_depth}$
    num_colors -- Number of rainbow bands to color the plot with.  Texture supplied will
                  be cloned (with different colors) using the texture_recolor method of the 
                  Tachyon object.

Plots a function by constructing a mesh with nonstandard sampling density
without gaps. At very high resolutions (depths > 10) it becomes very
slow.  Cython may help.  Complexity is approx.
$O(2^{2*maxdepth})$.  This
algorithm has been optimized for speed, not memory -- values from f(x,y) are
recycled rather than calling the function multiple times.  At high recursion
depth, this may cause problems for some machines.

Flat Triangles:
    sage: t = Tachyon(xres=512,yres=512, camera_center=(4,-4,3),viewdir=(-4,4,-3), raydepth=4)
    sage: t.light((4.4,-4.4,4.4), 0.2, (1,1,1))
    sage: def f(x,y): return float(sin(x*y))
    sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.1,  opacity=1.0, color=(1.0,0,0))
    sage: t.plot(f,(-4,4),(-4,4),"t0",max_depth=5,initial_depth=3, num_colors=60)  # increase min_depth for better picture
    sage: t.show()

Plotting with Smooth Triangles (requires explicit gradient function):
    sage: t = Tachyon(xres=512,yres=512, camera_center=(4,-4,3),viewdir=(-4,4,-3), raydepth=4)
    sage: t.light((4.4,-4.4,4.4), 0.2, (1,1,1))
    sage: def f(x,y): return float(sin(x*y))
    sage: def g(x,y): return ( float(y*cos(x*y)), float(x*cos(x*y)), 1 )
    sage: t.texture('t0', ambient=0.1, diffuse=0.9, specular=0.1,  opacity=1.0, color=(1.0,0,0))
    sage: t.plot(f,(-4,4),(-4,4),"t0",max_depth=5,initial_depth=3, grad_f = g)  # increase min_depth for better picture
    sage: t.show()

Preconditions: f is a scalar function of two variables, grad_f is None or a triple-valued 
               function of two variables, min_x != max_x, min_y != max_y
    sage: f = lambda x,y: x*y
    sage: t = Tachyon()
    sage: t.plot(f,(2.,2.),(-2.,2.),'')
    Traceback (most recent call last):
    ...
    ValueError: Plot rectangle is really a line.  Make sure min_x != max_x and min_y != max_y.

Overrides: structure.sage_object.SageObject.plot

parametric_plot(self, f, t_0, t_f, tex, r=0.1, cylinders=True, min_depth=4, max_depth=8, e_rel=0.01, e_abs=0.01)

source code 

Plots a space curve as a series of speheres and finite cylinders.
Example (twisted cubic) :
    sage: f = lambda t: (t,t^2,t^3)
    sage: t = Tachyon(camera_center=(5,0,4))
    sage: t.texture('t')
    sage: t.light((-20,-20,40), 0.2, (1,1,1))
    sage: t.parametric_plot(f,-5,5,'t',min_depth=6)