Module: sage.plot.tachyon
The Tachyon 3D Ray Tracer
Given any 3D graphics object one can compute a raytraced representation by typing
show(viewer='tachyon')
. For example, we draw two translucent spheres that
contain a red tube, and render the result using Tachyon.
sage: S = sphere(opacity=0.8, aspect_ratio=[1,1,1]) sage: L = line3d([(0,0,0),(2,0,0)], thickness=10, color='red') sage: M = S + S.translate((2,0,0)) + L sage: M.show(viewer='tachyon')
One can also directly control Tachyon, which gives a huge amount of flexibility. For example, here we directly use Tachyon to draw 3 spheres on the coordinate axes. Notice that the result is gorgeous:
sage: t = Tachyon(xres=500,yres=500, camera_center=(2,0,0)) sage: t.light((4,3,2), 0.2, (1,1,1)) sage: t.texture('t2', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(1,0,0)) sage: t.texture('t3', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(0,1,0)) sage: t.texture('t4', ambient=0.1, diffuse=0.9, specular=0.5, opacity=1.0, color=(0,0,1)) sage: t.sphere((0,0.5,0), 0.2, 't2') sage: t.sphere((0.5,0,0), 0.2, 't3') sage: t.sphere((0,0,0.5), 0.2, 't4') sage: t.show()
Author Log:
TODO: - clean up trianglefactory stuff
Module-level Functions
h, [s=1], [v=1]) |
hue(h,s=1,v=1) where 'h' stands for hue, 's' stands for saturation, 'v' stands for value. hue returns a list of rgb intensities (r, g, b) All values are in the range 0 to 1.
Input:
sage: hue(0.6) (0.0, 0.40000000000000036, 1.0)
hue is an easy way of getting a broader range of colors for graphics
sage: p = plot(sin, -2, 2, rgbcolor=hue(0.6))
s) |
Class: Cylinder
self, center, axis, radius, texture) |
Functions: str
Special Functions: __init__
Class: FCylinder
self, base, apex, radius, texture) |
Functions: str
Special Functions: __init__
Class: Light
self, center, radius, color) |
Functions: str
Special Functions: __init__
Class: ParametricPlot
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]) |
Functions: str,
tol
Special Functions: __init__,
_plot_step
Class: Plane
self, center, normal, texture) |
Functions: str
Special Functions: __init__
Class: PlotBlock
self, left, left_c, top, top_c, right, right_c, bottom, bottom_c) |
Special Functions: __init__
Class: Sphere
self, center, radius, texture) |
Functions: str
Special Functions: __init__
Class: Tachyon
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
is up,
positive
is to the left and
is toward you. This is
not oriented according to the right hand rule.
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()
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=None], [projection=PERSPECTIVE]) |
Functions: collect,
cylinder,
fcylinder,
light,
parametric_plot,
plane,
plot,
save,
show,
smooth_triangle,
sphere,
str,
texfunc,
texture,
texture_recolor,
triangle
self, objects) |
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. 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)
self, f, ['xmin', 'xmax'], ['ymin', 'ymax'], texture, [grad_f=None], [max_bend=0.7], [max_depth=5], [initial_depth=3], [num_colors=None]) |
Input:
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.
. 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.
self, [filename=sage.png], [verbose=0], [block=True], [extra_opts=]) |
Input:
self, [type=0], [center=(0, 0, 0)], [rotate=(0, 0, 0)], [scale=(1, 1, 1)]) |
Input:
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()
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:
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)
Special Functions: __init__,
__repr__,
_camera,
_res
Class: TachyonPlot
self, tachyon, f, ['min_x', 'max_x'], ['min_y', 'max_y'], tex, [g=None], [min_depth=4], [max_depth=8], [e_rel=0.01], [e_abs=0.01], [num_colors=None]) |
Functions: extrema,
interface,
plot_block,
str,
tol,
tol_list,
triangulate
Special Functions: __init__
Class: TachyonSmoothTriangle
Functions: str
Class: TachyonTriangle
Functions: str
Class: TachyonTriangleFactory
self, tach, tex) |
Functions: get_colors,
smooth_triangle,
triangle
Special Functions: __init__
Class: Texfunc
self, [type=0], [center=(0, 0, 0)], [rotate=(0, 0, 0)], [scale=(1, 1, 1)]) |
Functions: str
Special Functions: __init__
Class: 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], [phongtype=PLASTIC]) |
Functions: recolor,
str
Special Functions: __init__
See About this document... for information on suggesting changes.