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()
|
|
__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
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
| cylinder(self,
center,
axis,
radius,
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__
|
|
Inherited from object:
__class__
|
__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)
|
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)
|